在Qt qmake

时间:2015-05-19 15:54:48

标签: qt compilation makefile qmake

我有一个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 ++ )。

有什么建议吗?

3 个答案:

答案 0 :(得分: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

希望有所帮助。

答案 1 :(得分:0)

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

message($$QMAKESPEC)

到您的专业文件,以获取当前用于构建项目的编译器的准确名称。这给出了像

这样的东西
  

的/ usr /共享/ QT4 / mkspecs /的 Linux的克++

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

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

答案 2 :(得分:0)

或者(特别是在两个编译器之间没有区别的情况下),可以使用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 += ...
}

我不明白为什么查找不能直接与$$ OUT_PWD一起使用的原因,因此只需设置中间变量即可。我仅使用qt5对此进行了测试。

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