【问题标题】:Using conditional expression for Kits in Qt qmake在 Qt qmake 中为 Kits 使用条件表达式
【发布时间】:2015-07-31 13:35:39
【问题描述】:

我有一个 qmake (Qt 4.8.6) .pro 文件,我需要根据编译好的工具包添加条件表达式:

我目前有 2 个套件(使用不同的编译器),一个用于 桌面,一个用于 嵌入式平台,我的应用程序链接到一些库,这些库已编译桌面和嵌入式都在两个不同的文件夹中。

所以我想要实现的是:

unix { embedded-platform { LIBS+= -lonearm -ltwoarm etc... }}
unix { desktop { LIBS += -lonex86 -ltwox86 etc... }}

我仔细阅读了文档,但 我不知道如何从 .pro 中了解正在构建的套件

我已经尝试过https://forum.qt.io/topic/52954/solved-qmake-how-to-achieve-kit-detection-and-automatic-conditional-linking/3 提出的解决方案,但它并没有解决我的问题,因为无法区分同一平台上的自定义套件(两个编译器是 g++ 和 arm-linux-gnueabihf-g++)。

有什么建议吗?

【问题讨论】:

  • @phyatt 它与我发布的链接中的解决方案相同......它似乎无法区分不同的 linux-g++ (就像在这种情况下)

标签: qt compilation makefile qmake


【解决方案1】:

您也应该能够根据编译器进行切换。 mkspecs 文件夹中列出了要使用的关键字。

查看我计算机上的mkspecs 中的一个Qt 5.4 工具包,它有以下文件夹:

aix-g++
aix-g++-64
aix-xlc
aix-xlc-64
android-g++
blackberry-armle-v7-qcc
blackberry-armv7le-qcc
blackberry-x86-qcc
common
common/aix
common/android
common/c89
common/ios
common/ios/GLES2
common/mac
common/nacl
common/posix
common/qnx
common/wince
common/winrt_winphone
common/winrt_winphone/assets
common/winrt_winphone/manifests
common/winrt_winphone/manifests/8.0
common/winrt_winphone/manifests/8.1
common/winrt_winphone/manifests/8.1_wp
cygwin-g++
darwin-g++
devices
devices/blackberry-playbook-armle-v7-qcc
devices/blackberry-playbook-armv7le-qcc
devices/blackberry-playbook-x86-qcc
devices/common
devices/linux-archos-gen8-g++
devices/linux-arm-amlogic-8726M-g++
devices/linux-arm-hisilicon-hix5hd2-g++
devices/linux-arm-trident-pnx8473-g++
devices/linux-beagleboard-g++
devices/linux-imx53qsb-g++
devices/linux-imx6-g++
devices/linux-mipsel-broadcom-97425-g++
devices/linux-rasp-pi-g++
devices/linux-sh4-stmicro-ST7108-g++
devices/linux-sh4-stmicro-ST7540-g++
devices/linux-snowball-g++
devices/linux-tegra2-g++
features
features/android
features/data
features/data/android
features/data/cmake
features/data/headersclean
features/mac
features/qpa
features/unix
features/win32
features/winrt
freebsd-g++
freebsd-g++46
freebsd-icc
hpux-acc
hpux-acc-64
hpux-acc-o64
hpux-g++
hpux-g++-64
hpuxi-acc-32
hpuxi-acc-64
hpuxi-g++-64
hurd-g++
irix-cc
irix-cc-64
irix-g++
irix-g++-64
linux-arm-gnueabi-g++
linux-clang
linux-clang-libc++
linux-cxx
linux-g++
linux-g++-32
linux-g++-64
linux-icc
linux-icc-32
linux-icc-64
linux-kcc
linux-llvm
linux-lsb-g++
linux-pgcc
lynxos-g++
macx-clang
macx-clang-32
macx-g++
macx-g++-32
macx-g++40
macx-g++42
macx-icc
macx-ios-clang
macx-ios-clang/features
macx-llvm
macx-xcode
modules
netbsd-g++
openbsd-g++
qnx-armle-v7-qcc
qnx-armv7le-qcc
qnx-x86-qcc
sco-cc
sco-g++
solaris-cc
solaris-cc-64
solaris-cc-64-stlport
solaris-cc-stlport
solaris-g++
solaris-g++-64
tru64-cxx
tru64-g++
unixware-cc
unixware-g++
unsupported
unsupported/android-g++
unsupported/freebsd-clang
unsupported/integrity-ghs
unsupported/linux-armcc
unsupported/linux-host-g++
unsupported/linux-scratchbox2-g++
unsupported/nacl-g++
unsupported/nacl64-g++
unsupported/qnx-X11-g++
unsupported/vxworks-ppc-dcc
unsupported/vxworks-ppc-g++
unsupported/vxworks-simpentium-dcc
unsupported/vxworks-simpentium-g++
unsupported/win32-msvc2003
win32-g++
win32-icc
win32-msvc2005
win32-msvc2008
win32-msvc2010
win32-msvc2012
win32-msvc2013
wince60standard-armv4i-msvc2005
wince60standard-x86-msvc2005
wince70embedded-armv4i-msvc2008
wince70embedded-x86-msvc2008
winphone-arm-msvc2012
winphone-arm-msvc2013
winphone-x86-msvc2012
winphone-x86-msvc2013
winrt-arm-msvc2012
winrt-arm-msvc2013
winrt-x64-msvc2012
winrt-x64-msvc2013
winrt-x86-msvc2012
winrt-x86-msvc2013

希望对您有所帮助。

【讨论】:

  • 但是我应该根据我在 Qt Creator 中创建的工具包手动将新的 mkspec 添加到 mkspecs 文件夹吗?到目前为止,我找不到任何与我的工具包相关的东西......
  • 我之前没有做过定制套件,所以不能说。在自定义套件的构建输出中,它是否生成了 mkspecs 文件夹?如果需要,您可以将它与其他 mkspecs 文件夹合并...
【解决方案2】:

我没有足够的声誉来评论 phyatts 的答案,这基本上是正确的。 出于调试目的,您可以添加

message($$QMAKESPEC)

到您的 pro 文件以获取当前用于构建项目的编译器的精确名称。这给出了类似

/usr/share/qt4/mkspecs/linux-g++

其中粗体部分是范围值。 mkspecs 应该与套件一起提供,例如包含在您安装的工具链中。切换工具包获取第二个编译器的名称。然后使用符合的范围值

linux-g++: { message( "found g++" ) }
linux-gnueabi-oe-g++: { message( "found g++ embedded" ) }

【讨论】:

    【解决方案3】:

    或者(特别是当两个编译器之间没有区别时)可以在输出文件夹名称中使用OUT_PWD 变量到find 特定子字符串(模式)(如果未修改,则默认包含来自general settings 的套件名称) .

    OUT_PWD = $$OUT_PWD
    X2_PWD = $$find(OUT_PWD, "Linux_X2")
    !isEmpty(X2_PWD) {
        message("Compiling for X2 device")
        # LIBS += ...
    }
    

    我不明白为什么 find 不能直接与 $$OUT_PWD 一起使用,所以只需制作中间变量。我只用 qt5 对此进行了测试。

    当然也可以轻松使用其他变量,例如QMAKESPEC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      相关资源
      最近更新 更多