QT:一个通用工程文件配置,可以存储为common.pri
defineReplace(libraryName) {
unset(LIBRARY_NAME)
LIBRARY_NAME = $$1
CONFIG(debug, debug|release) {
!debug_and_release|build_pass {
mac:RET = $$member(LIBRARY_NAME, 0)_debug
else:win32:RET = $$member(LIBRARY_NAME, 0)d
}
}
isEmpty(RET):RET = $$LIBRARY_NAME
return($$RET)
}
#指定生成的临时文件放置的目录
MOC_DIR = temp/moc
RCC_DIR = temp/rcc
UI_DIR = temp/ui
OBJECTS_DIR = temp/obj
#指定生成的应用程序放置的目录
IDE_APP_TARGET =
IDE_SOURCE_TREE = $$PWD #.pri文件所在的位置
IDE_BUILD_TREE = $$IDE_SOURCE_TREE/../
#message($$IDE_SOURCE_TREE)
macx {
IDE_APP_PATH = $$IDE_BUILD_TREE/bin
IDE_LIBRARY_PATH = $$IDE_APP_PATH/$${IDE_APP_TARGET}.app/Contents/PlugIns
IDE_PLUGIN_PATH = $$IDE_LIBRARY_PATH
IDE_DATA_PATH = $$IDE_APP_PATH/$${IDE_APP_TARGET}.app/Contents/Resources
IDE_BIN_PATH = $$IDE_APP_PATH/$${IDE_APP_TARGET}.app/Contents/MacOS
contains(QT_CONFIG, ppc):CONFIG += ppc x86
copydata = 1
} else {
IDE_BIN_PATH = $$IDE_BUILD_TREE/bin
IDE_LIBRARY_PATH = $$IDE_BUILD_TREE/lib
IDE_PLUGIN_PATH = $$IDE_LIBRARY_PATH/plugins
IDE_DATA_PATH = $$IDE_BUILD_TREE/data
!isEqual(IDE_SOURCE_TREE, $$IDE_BUILD_TREE):copydata = 1
}
win32:CONFIG(debug, debug|release){
contains(DEFINES, WIN64) {
DESTDIR = $$IDE_BUILD_TREE/_debug64
} else {
DESTDIR = $$IDE_BUILD_TREE/_debug86
}
} else:win32:CONFIG(release, debug|release){
contains(DEFINES, WIN64) {
DESTDIR = $$IDE_BUILD_TREE/_release64
} else {
DESTDIR = $$IDE_BUILD_TREE/_release86
}
}
macx:CONFIG(debug, debug|release){
DESTDIR = $$IDE_BUILD_TREE/_debug64
} else:macx:CONFIG(release, debug|release){
DESTDIR = $$IDE_BUILD_TREE/_release64
}
#Release禁止输出qWarning/qDebug信息
CONFIG (release, debug|release) {
DEFINES += QT_NO_WARNING_OUTPUT
DEFINES += QT_NO_DEBUG_OUTPUT
}
linux-g++-* {
# Bail out on non-selfcontained libraries. Just a security measure
# to prevent checking in code that does not compile on other platforms.
QMAKE_LFLAGS += -Wl,--allow-shlib-undefined -Wl,--no-undefined
}
win32-msvc* {
#Don't warn about sprintf, fopen etc being 'unsafe'
DEFINES += _CRT_SECURE_NO_WARNINGS
}
linux* {
contains(CONFIG, gl_qtwebkit) {
DEFINES += GL_QTWEBKIT
}
} else {
greaterThan(QT_MAJOR_VERSION, 4) {
} else {
DEFINES += GL_QTWEBKIT
}
}
#Release编译,生成*.pdb调试文件
QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE += $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
这段代码做更详细的解释:
defineReplace(qtLibraryName)
:这是一个用于修改库名的函数。函数接受一个参数(库名),根据当前的编译配置(调试或发布)来修改库名。例如,如果当前是调试配置,那么在Mac平台上会在库名后添加”_debug”,在Win32平台上会在库名后添加”d”。MOC_DIR
、RCC_DIR
、UI_DIR
、OBJECTS_DIR
:这些变量定义了Qt的moc(元对象编译器)、rcc(资源编译器)、ui(用户界面编译器)和obj(目标文件)的输出路径。IDE_APP_TARGET
、IDE_SOURCE_TREE
、IDE_BUILD_TREE
:这些变量定义了应用程序的目标名、源代码树的位置和构建树的位置。macx {...}
:这个块定义了在Mac平台上的一些设置,例如应用程序的路径、库的路径、插件的路径、数据的路径和二进制文件的路径。win32:CONFIG(debug, debug|release){...}
和win32:CONFIG(release, debug|release){...}
:这两个块定义了在Windows平台上的一些设置,例如在调试和发布配置下,根据是否定义了WIN64
来设置目标文件的输出路径。CONFIG (release, debug|release) {...}
:这个块定义了在发布配置下的一些设置,例如禁止输出qWarning和qDebug信息。linux-g++-* {...}
、win32-msvc* {...}
和linux* {...}
:这些块针对不同的编译器和平台(Linux g++、Windows MSVC、Linux)定义了一些特定的设置,例如链接选项、预处理器定义等。QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
和QMAKE_LFLAGS_RELEASE += $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
:这两行使得在发布配置下生成的二进制文件包含了调试信息,这样在发布版本上也能进行一些调试操作。