在使用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:更改Windows构建(发布和调试)的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}
答案 0 :(得分:0)
创意1
MSVC通常将目标文件放入build dir的release / debug子目录中。其他编译器没有。
因此,您只需在release/
和debug/
之间添加${QMAKE_VAR_OBJECTS_DIR}
或${QMAKE_FILE_IN_BASE}
,例如
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
之间是否存在某些内容。