qmake如何确定在Makefile中使用的编译器?

7
qt源码自带一些示例。从互联网下载后,进入examples/painting/concentriccircles目录并运行“qmake”,它会从.pro文件生成Makefile(设置CC=gcc)。经过make后,我可以在我的CentOS机器上运行演示程序concentriccircles。(运行x86代码)
现在我有一个在sparc机器上运行的OS上运行Qt的项目,并且已经设置好了构建树。如果我将整个concentriccircles目录移动到构建树中的某个位置,当我运行“qmake”时,生成的Makefile会将CC设置为sparc-xxx-gcc,而不是普通的gcc(用于x86主机)。实际上,即使不移动目录,如果我从sparc构建树中运行qmake,它也会为sparc制作Makefile。(无论.pro文件如何)
qmake如何知道我正在从哪个位置构建qt程序以供sparc机器使用?下面是concentriccircles.pro文件。
HEADERS       = circlewidget.h \
                window.h
SOURCES       = circlewidget.cpp \
                main.cpp \
                window.cpp

# install
target.path = $$[QT_INSTALL_EXAMPLES]/painting/concentriccircles
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS concentriccircles.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/painting/concentriccircles
INSTALLS += target sources

symbian {
    TARGET.UID3 = 0xA000A64A
    include($$QT_SOURCE_TREE/examples/symbianpkgrules.pri)
}
maemo5: include($$QT_SOURCE_TREE/examples/maemo5pkgrules.pri)

1
编译器在设置构建环境时指定。编译器不会从项目规格中读取。 - Sebastian Lange
1个回答

10

首先,您需要知道qmake默认使用的规范。您可以通过执行以下操作来检查:

qmake -query QMAKE_MKSPECS

结果应该是包含所有 mkspecs 的路径,即:
/usr/share/qt4/mkspecs

现在您可以检查默认的mkspec:

ls -lah /usr/share/qt4/mkspecs/default

结果(适用于我的配置)

/usr/share/qt4/mkspecs/default -> linux-g++-64

很明显,你可以看到我默认的是linux-g++-64 mkspec。

现在让我们来看看spec里面有什么:

cat /usr/share/qt4/mkspecs/default/qmake.conf

结果:

#
# qmake configuration for linux-g++
#
# Written for GNU/Linux platforms that have both lib and lib64 directories,
# like the AMD Opteron.
#

MAKEFILE_GENERATOR  = UNIX
TARGET_PLATFORM     = unix
TEMPLATE        = app
CONFIG          += qt warn_on release incremental link_prl gdb_dwarf_index
QT          += core gui
QMAKE_INCREMENTAL_STYLE = sublib

QMAKE_CFLAGS        = -m64
QMAKE_LFLAGS        = -m64

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)


QMAKE_LIBDIR_X11      = /usr/X11R6/lib64
QMAKE_LIBDIR_OPENGL   = /usr/X11R6/lib64

load(qt_config)

正如您所看到的,它包含一些其他的.conf文件。在我的配置中,g++-unix.conf只包括了g++-base.conf,所以我会直接介绍它:

cat /usr/share/qt4/mkspecs/common/g++-base.conf

结果:

#
# Qmake configuration for the GNU C++ compiler
#
# Before making changes to this file, please read the comment in
# gcc-base.conf, to make sure the change goes in the right place.
#
# To verify that your change has the desired effect on the final configuration
# you can use the manual test in tests/manual/mkspecs.
#

QMAKE_CC = gcc

QMAKE_LINK_C       = $$QMAKE_CC
QMAKE_LINK_C_SHLIB = $$QMAKE_CC

QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -g

QMAKE_CXX = g++

QMAKE_LINK       = $$QMAKE_CXX
QMAKE_LINK_SHLIB = $$QMAKE_CXX

QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO

QMAKE_PCH_OUTPUT_EXT = .gch

QMAKE_CFLAGS_PRECOMPILE       = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CFLAGS_USE_PRECOMPILE   = -include ${QMAKE_PCH_OUTPUT_BASE}
QMAKE_CXXFLAGS_PRECOMPILE     = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE

正如您所看到的,编译器严格由所选的qmake规范文件定义。您可以通过调用不同的规范文件来使用它。
qmake -spec SPEC_NAME

SPEC_NAME应该是qmake -query QMAKE_MKSPECS中的目录名称。


我并没有说它适用于Qt5 - 在Qt5上,没有QMAKE_MKSPECS,但是mkspecs目录仍然存在(可能在不同的路径中) - 选择qmake的“构建环境”仍然是通过qmake -spec开关完成的。 - Kamil Klimek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接