QMAKE_EXTRA_COMPILERS输出目录,msvc

时间:2015-05-15 17:42:36

标签: c++ qt qmake

在使用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}

1 个答案:

答案 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之间是否存在某些内容。