【发布时间】:2017-07-31 14:34:58
【问题描述】:
所以,我有一个简单的项目,其中包含从两个源编译的库,并且可执行依赖于这个库:
./a.cpp
#include "a.h"
int a() {
return X;
}
./a.h
int a();
./b.cpp
#include "b.h"
int b() {
return 2;
}
./b.h
int b();
./c.cpp
#include "a.h"
#include "b.h"
#include "c.h"
int c() {
return a() + b();
}
int main() {
return c();
}
./c.h
int c();
./CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
set_property(
SOURCE a.cpp
APPEND
PROPERTY COMPILE_DEFINITIONS
"X=${X}"
)
add_library(ab a.cpp b.cpp)
add_executable(c c.cpp)
target_link_libraries(c ab)
我通过(内部构建目录)编译它
cmake .. -DX=4
make
那我想把 X 改成 5,我愿意
cmake .. -DX=5
make
我希望文件 a.cpp 被重新编译,ab 和 c 被重新链接(因为它们都依赖于这个 cpp 文件),但我不希望重新编译其他 cpp,因为它们的编译选项没有改变,他们不依赖于a.cpp
我得到的是 a.cpp 和 b.cpp 都被重新编译(而 c.cpp 正确地没有被重新编译)
所以我的问题是:
- 这是预期的行为。如果是,为什么?
- 如何构建项目,以便更改 1 个文件的编译选项不会重新编译库中的每个文件?
在 Linux 上尝试过 CMake 3.5.1,在 MacOS 上尝试过 CMake 3.7.2
【问题讨论】: