c++ - 为什么当只有一个文件的选项发生变化时 CMake 会重新编译所有库源代码?

标签 c++ build cmake recompile

所以,我有一个简单的项目,其中包含从两个来源编译的库和依赖于此库的可执行文件:

./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 被重新编译,并且 abc 被重新链接(因为它们都依赖于这个 cpp 文件), 但我希望不会重新编译其他 cpp,因为它们的编译选项没有改变,而且它们不依赖于 a.cpp

我得到的是 a.cppb.cpp 都被重新编译(而 c.cpp 正确地没有被重新编译)

所以我的问题是:

  • 这是预期的行为吗?如果是,为什么?
  • 如何构建项目,以便更改 1 个文件的编译选项不会重新编译库中的每个文件?

尝试过 Linux 上的 CMake 3.5.1 和 MacOS 上的 CMake 3.7.2

最佳答案

是的,这是预期的。 CMake 不会为宏生成依赖信息,因为它们太复杂而无法处理。

有可能generate多个配置文件;通过这种方式,它被视为简单的 header 时间戳依赖项。

关于c++ - 为什么当只有一个文件的选项发生变化时 CMake 会重新编译所有库源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42715155/

相关文章:

c++ - 如何通过指针更改类成员值

c++ - 将float转换为int,当int溢出范围时,将其设为max int或min int

java - maven 将版本号添加到 war - 不会部署

ios - 无法运行 faSTLane 叹息。 "Couldn' t下载证书"

c++ - 库正在调用可执行文件内的函数,而不是库内的函数

c++ - OpenCV - 从图像网格中拼接图像

c++ - 在系统中安装我编译的库以供可执行文件使用

java - 跳过子项目中的gradle子任务

windows - ExternalProject_Add 何时构建?

gcc - 强制 CMake 使用静态库