qmake 如何确定在 Makefile 中使用的编译器?
how does qmake determine the compiler to use in Makefile?
qt 源代码附带了一些示例。
从互联网上下载后,我转到 examples/painting/concentriccircles 和 运行 'qmake' 并从 .pro 文件生成 Makefile(设置 CC=gcc),在 make 之后,我可以运行 我的 CentOS 机器上的演示程序同心圆。 (运行宁 x86 代码)。
现在我在 sparc 机器 运行ning 和 OS 上有一个项目 运行ning Qt 并且我已经设置了构建树。如果我将整个 concentriccircles 目录移动到构建树中的某个位置,当我 运行 'qmake' 时,生成的 Makefile 设置 CC=sparc-xxx-gcc 而不是普通的 gcc(用于 x86 主机).事实上,在不移动目录的情况下,如果我从 sparc 构建树中 运行 qmake,它会为 sparc 生成 Makefile。 (不考虑 .pro 文件)
qmake 如何从我 运行 qmake 所在的位置知道我正在为 sparc 机器构建 qt 程序?下面是 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)
首先你需要知道默认情况下qmake使用的是哪个规范。您可以通过
来检查
qmake -query QMAKE_MKSPECS
结果应该是包含所有 mkspec 的路径,即
/usr/share/qt4/mkspecs
现在您可以检查默认的 mkspec:
ls -lah /usr/share/qt4/mkspecs/default
结果(针对我的配置)
/usr/share/qt4/mkspecs/default -> linux-g++-64
很明显你可以看到我默认有 linux-g++-64 mkspec
现在让我们看看规格里面有什么:
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
里面的目录名
qt 源代码附带了一些示例。 从互联网上下载后,我转到 examples/painting/concentriccircles 和 运行 'qmake' 并从 .pro 文件生成 Makefile(设置 CC=gcc),在 make 之后,我可以运行 我的 CentOS 机器上的演示程序同心圆。 (运行宁 x86 代码)。
现在我在 sparc 机器 运行ning 和 OS 上有一个项目 运行ning Qt 并且我已经设置了构建树。如果我将整个 concentriccircles 目录移动到构建树中的某个位置,当我 运行 'qmake' 时,生成的 Makefile 设置 CC=sparc-xxx-gcc 而不是普通的 gcc(用于 x86 主机).事实上,在不移动目录的情况下,如果我从 sparc 构建树中 运行 qmake,它会为 sparc 生成 Makefile。 (不考虑 .pro 文件)
qmake 如何从我 运行 qmake 所在的位置知道我正在为 sparc 机器构建 qt 程序?下面是 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)
首先你需要知道默认情况下qmake使用的是哪个规范。您可以通过
来检查qmake -query QMAKE_MKSPECS
结果应该是包含所有 mkspec 的路径,即
/usr/share/qt4/mkspecs
现在您可以检查默认的 mkspec:
ls -lah /usr/share/qt4/mkspecs/default
结果(针对我的配置)
/usr/share/qt4/mkspecs/default -> linux-g++-64
很明显你可以看到我默认有 linux-g++-64 mkspec
现在让我们看看规格里面有什么:
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