QMAKE_EXTRA_COMPILERS 输出目录,msvc
QMAKE_EXTRA_COMPILERS output directory, msvc
在一个使用 msvc2013 的 Qt 项目中,我有一个 .cpp 必须使用自定义选项 /arch:IA32 和预处理器命令构建 _CRT_SECURE_NO_WARNINGS。
这是我的 .pro 文件中有趣的部分:
CONFIG(release, debug|release){
DESTDIR = RELEASE
OBJECTS_DIR = RELEASE/.obj
MOC_DIR = RELEASE/.moc
RCC_DIR = RELEASE/.rcc
UI_DIR = RELEASE/.ui
}
CONFIG(debug, debug|release){
DESTDIR = DEBUG
OBJECTS_DIR = DEBUG/.obj
MOC_DIR = DEBUG/.moc
RCC_DIR = DEBUG/.rcc
UI_DIR = DEBUG/.ui
}
(...)
SPECIAL_SOURCE = extractor.cpp
ExtraCompiler.input = SPECIAL_SOURCE
ExtraCompiler.variable_out = OBJECTS
ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
ExtraCompiler.commands = $${QMAKE_CXX} $(CXXFLAGS) /arch:IA32 /D_CRT_SECURE_NO_WARNINGS $(INCPATH) -c ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
QMAKE_EXTRA_COMPILERS += ExtraCompiler
我遇到的问题是创建的对象 - "extractor.obj" - 没有与其他对象放在同一目录中。该目录可以是 RELEASE/.obj 或 DEBUG/.obj。取而代之的是,"extractor.obj" 是在根目录中创建的,就在我的 .pro 文件旁边。
该系统可与其他编译器一起使用,例如 MinGW、Clang 或 GCC。我不知道这里出了什么问题。有没有人遇到过同样的问题?
非常感谢。
编辑:找到两个解决方案
解决方案 1: 将 ExtraCompiler.output 更改为 windows 构建(发布和调试)
SPECIAL_SOURCE = extractor.cpp
ExtraCompiler.input = SPECIAL_SOURCE
ExtraCompiler.variable_out = OBJECTS
win32:CONFIG(release, debug|release): ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}release/${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
else:win32:CONFIG(debug, debug|release): ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}debug/${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
else: ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
ExtraCompiler.commands = $${QMAKE_CXX} $(CXXFLAGS) -arch:IA32 -D_CRT_SECURE_NO_WARNINGS $(INCPATH) -c ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
解决方案 2:使用 -Fo 而不是 -o 指定输出文件夹 (https://msdn.microsoft.com/en-us/library/yb8e9b8y.aspx)
SPECIAL_SOURCE = extractor.cpp
ExtraCompiler.input = SPECIAL_SOURCE
ExtraCompiler.variable_out = OBJECTS
ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
ExtraCompiler.commands = $${QMAKE_CXX} $(CXXFLAGS) -arch:IA32 -D_CRT_SECURE_NO_WARNINGS $(INCPATH) -c ${QMAKE_FILE_IN} -Fo${QMAKE_FILE_OUT}
想法 1
MSVC 通常将目标文件放入构建目录的 release/debug 子目录中。其他编译器没有。
因此您只需要在${QMAKE_VAR_OBJECTS_DIR}
和${QMAKE_FILE_IN_BASE}
之间添加release/
或debug/
,例如
win32:CONFIG(release, debug|release): ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}release/${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
else:win32:CONFIG(debug, debug|release): ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}debug/${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
else: ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
想法 2
你的ExtraCompiler.input
是空的,因为你在使用自定义的qmake变量的时候,需要在使用的时候加上$$
。尝试
SPECIAL_SOURCE = extractor.cpp
ExtraCompiler.input = $$SPECIAL_SOURCE
现在检查您的错误消息中是否有 /
和 .obj
之间的内容。
在一个使用 msvc2013 的 Qt 项目中,我有一个 .cpp 必须使用自定义选项 /arch:IA32 和预处理器命令构建 _CRT_SECURE_NO_WARNINGS。
这是我的 .pro 文件中有趣的部分:
CONFIG(release, debug|release){
DESTDIR = RELEASE
OBJECTS_DIR = RELEASE/.obj
MOC_DIR = RELEASE/.moc
RCC_DIR = RELEASE/.rcc
UI_DIR = RELEASE/.ui
}
CONFIG(debug, debug|release){
DESTDIR = DEBUG
OBJECTS_DIR = DEBUG/.obj
MOC_DIR = DEBUG/.moc
RCC_DIR = DEBUG/.rcc
UI_DIR = DEBUG/.ui
}
(...)
SPECIAL_SOURCE = extractor.cpp
ExtraCompiler.input = SPECIAL_SOURCE
ExtraCompiler.variable_out = OBJECTS
ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
ExtraCompiler.commands = $${QMAKE_CXX} $(CXXFLAGS) /arch:IA32 /D_CRT_SECURE_NO_WARNINGS $(INCPATH) -c ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
QMAKE_EXTRA_COMPILERS += ExtraCompiler
我遇到的问题是创建的对象 - "extractor.obj" - 没有与其他对象放在同一目录中。该目录可以是 RELEASE/.obj 或 DEBUG/.obj。取而代之的是,"extractor.obj" 是在根目录中创建的,就在我的 .pro 文件旁边。
该系统可与其他编译器一起使用,例如 MinGW、Clang 或 GCC。我不知道这里出了什么问题。有没有人遇到过同样的问题? 非常感谢。
编辑:找到两个解决方案
解决方案 1: 将 ExtraCompiler.output 更改为 windows 构建(发布和调试)
SPECIAL_SOURCE = extractor.cpp
ExtraCompiler.input = SPECIAL_SOURCE
ExtraCompiler.variable_out = OBJECTS
win32:CONFIG(release, debug|release): ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}release/${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
else:win32:CONFIG(debug, debug|release): ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}debug/${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
else: ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
ExtraCompiler.commands = $${QMAKE_CXX} $(CXXFLAGS) -arch:IA32 -D_CRT_SECURE_NO_WARNINGS $(INCPATH) -c ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
解决方案 2:使用 -Fo 而不是 -o 指定输出文件夹 (https://msdn.microsoft.com/en-us/library/yb8e9b8y.aspx)
SPECIAL_SOURCE = extractor.cpp
ExtraCompiler.input = SPECIAL_SOURCE
ExtraCompiler.variable_out = OBJECTS
ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
ExtraCompiler.commands = $${QMAKE_CXX} $(CXXFLAGS) -arch:IA32 -D_CRT_SECURE_NO_WARNINGS $(INCPATH) -c ${QMAKE_FILE_IN} -Fo${QMAKE_FILE_OUT}
想法 1
MSVC 通常将目标文件放入构建目录的 release/debug 子目录中。其他编译器没有。
因此您只需要在${QMAKE_VAR_OBJECTS_DIR}
和${QMAKE_FILE_IN_BASE}
之间添加release/
或debug/
,例如
win32:CONFIG(release, debug|release): ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}release/${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
else:win32:CONFIG(debug, debug|release): ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}debug/${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
else: ExtraCompiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${QMAKE_EXT_OBJ}
想法 2
你的ExtraCompiler.input
是空的,因为你在使用自定义的qmake变量的时候,需要在使用的时候加上$$
。尝试
SPECIAL_SOURCE = extractor.cpp
ExtraCompiler.input = $$SPECIAL_SOURCE
现在检查您的错误消息中是否有 /
和 .obj
之间的内容。