2016-01-11 6 views
0

У меня есть подкаталог проект:Условный сборки статической библиотеки, которая более чем один исполняемый файл зависит в QMAKE

//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 undefined». Я понимаю, что myLib был скомпилирован без этого флага перед исполняемым файлом, а затем был просто связан с ним без изменения, но есть ли способ сделать библиотеку построенной дважды и для одного из исполняемых файлов передать эту опцию компилятора в библиотеку?

ответ

0

Вы не можете достичь этого без компиляции 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 для логической переменной для коммутатора), но я полагаю, что это невозможно сделать, если вы задали вопрос так, как вы просили Это.

+0

Наконец, я решил переименовать 'myLib.pro' в' myLib.pri', создать два файла pro 'myLibWithDef.pro' и' myLibWithoutDef.pro'. В обоих включил 'myLib.pri', и в одном из них я добавил' DEFINES + = MY_DEFINE'. – VALOD9

+0

Отлично, я не часто использую .pri-файл, но это хороший способ исправить вашу проблему здесь. – jpo38