В проекте 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}
Это не работает. .obj все еще создается рядом с .pro-файлом. Компилятор попытается найти его в каталоге RELEASE/.obj/release, который пуст – Mezzo
@Mezzo okay, ваше базовое имя отсутствовало перед '.obj'. Я обновил ответ. Вы можете проверить еще раз? –
Большое спасибо! Добавление «$$» не требуется, изменений нет. Я нашел другое решение при игре с атрибутом компилятора: я использовал 'ExtraCompiler.commands = $$ {QMAKE_CXX} $ (CXXFLAGS) -arch: IA32 -D_CRT_SECURE_NO_WARNINGS $ (INCPATH) -c $ {QMAKE_FILE_IN} -Fo $ {QMAKE_FILE_OUT}' (обратите внимание на запись -Fo) – Mezzo