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 之间的内容。