2015-05-15 3 views
0

В проекте Qt с использованием msvc2013 у меня есть один .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. Я не знаю, что здесь не так. Кто-нибудь сталкивался с той же проблемой? Большое спасибо.


Edit: два решения найдено

Решение 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 места объектные файлы, как правило, в релиз/отладки подкаталоге сборки в реж. Другие компиляторы этого не делают.

Таким образом, вы просто должны добавить 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 okay, ваше базовое имя отсутствовало перед '.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

Смежные вопросы