静态库的条件构建,在 qmake 中有多个可执行文件依赖
Conditional build of static library which more then one executable depends on in 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
,在另一个中不想定义。所以我尝试在 executable_one.pro
文件中添加 DEFINES += MY_DEFINE
,但在这两种情况下输出都是 "MY_DEFINE is undefined"。我知道 myLib
在可执行文件之前是在没有这个标志的情况下编译的,然后只是在没有改变的情况下链接到它,但是有什么办法可以使库被构建两次并且其中一个可执行文件将这个编译器选项传递给库?
如果不编译 myLib
两次就无法实现。
您必须构建库两次(最简单的方法是为库创建两个 .pro 文件),一个有 DEFINES += MY_DEFINE
一个没有。然后,这两个 .pro 文件必须定义不同的目标(一个可以是 myLib_my_define
,另一个可以是 myLib_no_my_define
)。
稍后 executable_one
将 link 与 myLib_my_define
,executable_two
将 link 与 myLib_no_my_define
。
显然,另一种方法是用常规变量替换 pre-processing 变量(让 foo
为开关取一个布尔变量),但我想如果你这样做是不可能的按照你问的方式问问题。
我有子目录项目:
//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
,在另一个中不想定义。所以我尝试在 executable_one.pro
文件中添加 DEFINES += MY_DEFINE
,但在这两种情况下输出都是 "MY_DEFINE is undefined"。我知道 myLib
在可执行文件之前是在没有这个标志的情况下编译的,然后只是在没有改变的情况下链接到它,但是有什么办法可以使库被构建两次并且其中一个可执行文件将这个编译器选项传递给库?
如果不编译 myLib
两次就无法实现。
您必须构建库两次(最简单的方法是为库创建两个 .pro 文件),一个有 DEFINES += MY_DEFINE
一个没有。然后,这两个 .pro 文件必须定义不同的目标(一个可以是 myLib_my_define
,另一个可以是 myLib_no_my_define
)。
稍后 executable_one
将 link 与 myLib_my_define
,executable_two
将 link 与 myLib_no_my_define
。
显然,另一种方法是用常规变量替换 pre-processing 变量(让 foo
为开关取一个布尔变量),但我想如果你这样做是不可能的按照你问的方式问问题。