У меня есть проект subdir:
//exaple.pro
TEMPLATE = subdirs
SUBDIRS += \
myLib \
executable_one \
executable_two
myLib
статическая библиотека с одной функцией:
//MyLib.h
void foo();
//MyLib.cpp
#include "MyLib.h"#include <iostream>
void foo()
{
# ifdef MY_DEFINE
std::cout << "MY_DEFINE is defined\n";
# else
std::cout << "MY_DEFINE is undefined\n";
# endif
}
И два других проекта, которые ссылаются на эту библиотеку executable_one
а также executable_two
, В одном я хочу определить MY_DEFINE
в другом нет. Итак, я попытался добавить DEFINES += MY_DEFINE
в executable_one.pro
файл, но в обоих случаях вывод «MY_DEFINE не определен». Я это понимаю myLib
был скомпилирован без этого флага перед исполняемым файлом, а затем был просто связан с ним без изменений, но есть ли способ заставить библиотеку быть собранной дважды, и для одного из исполняемых файлов передать эту опцию компилятора в библиотеку?
Вы не сможете достичь этого без компиляции myLib
дважды.
Вы должны собрать библиотеку дважды (проще всего иметь два .pro-файла для библиотеки), один с DEFINES += MY_DEFINE
один без. Затем два файла .pro должны определять другую цель (один может быть myLib_my_define
, другой, myLib_no_my_define
).
Потом executable_one
свяжется с myLib_my_define
, а также executable_two
свяжется с myLib_no_my_define
,
Очевидно, альтернатива состоит в том, чтобы заменить вашу переменную предварительной обработки обычной переменной (есть foo
возьмите булеву переменную для переключателя), но я полагаю, что это невозможно сделать, если вы задали вопрос так, как задали его.
Других решений пока нет …