2015-05-15 69 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