静态库的条件构建,在 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_oneexecutable_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_defineexecutable_two 将 link 与 myLib_no_my_define

显然,另一种方法是用常规变量替换 pre-processing 变量(让 foo 为开关取一个布尔变量),但我想如果你这样做是不可能的按照你问的方式问问题。