在使用msvc2013的Qt项目中,我有一个.cpp,必须使用自定义选项/ arch:IA32和预处理器命令_CRT_SECURE_NO_WARNINGS构建。QMAKE_EXTRA_COMPILERS输出目录msvc
这里是有趣的部分我.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窗户建设(发布和调试)
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}
这不起作用,.obj仍然创建在.pro文件旁边。链接器现在尝试在RELEASE/.obj/release目录中找到它,该目录为空 – Mezzo
@Mezzo好的,您的基本名称在'.obj'前面丢失。我更新了答案。你能再次检查吗? –
非常感谢它!添加“$$”不是必需的,没有变化。我使用'ExtraCompiler.commands = $$ {QMAKE_CXX} $(CXXFLAGS)-arch:IA32 -D_CRT_SECURE_NO_WARNINGS $(INCPATH)-c $ {QMAKE_FILE_IN} -Fo $ {QMAKE_FILE_OUT}时发现另一个解决方案' (注意-Fo条目) – Mezzo