因此,我有一个简单的项目,其库从两个来源编译而来,可执行文件取决于此库:
./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
正确未重新编译)所以我的问题是:
在Linux上尝试了CMake 3.5.1,在MacOS上尝试了CMake 3.7.2
最佳答案
是的,这是预期的。 CMake不会为宏生成依赖项信息,因为它们处理起来过于复杂。
可以generate多个配置文件;这样,它被视为简单的报头时间戳依赖项。
关于c++ - 当仅更改一个文件的选项时,为什么CMake重新编译所有库源代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42715155/