2015-05-15 43 views
0

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

回答

0

理念1

MSVC邻居对象文件通常为build目录的发布/调试子目录。其他编译器不。因此,您只需要在${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}之间添加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之间的事情。

+0

这不起作用,.obj仍然创建在.pro文件旁边。链接器现在尝试在RELEASE/.obj/release目录中找到它,该目录为空 – Mezzo

+0

@Mezzo好的,您的基本名称在'.obj'前面丢失。我更新了答案。你能再次检查吗? –

+0

非常感谢它!添加“$$”不是必需的,没有变化。我使用'ExtraCompiler.commands = $$ {QMAKE_CXX} $(CXXFLAGS)-arch:IA32 -D_CRT_SECURE_NO_WARNINGS $(INCPATH)-c $ {QMAKE_FILE_IN} -Fo $ {QMAKE_FILE_OUT}时发现另一个解决方案' (注意-Fo条目) – Mezzo