因此,我有一个简单的项目,其库从两个来源编译而来,可执行文件取决于此库:

./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多个配置文件;这样,它被视为简单的报头时间戳依赖项。

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

    10-11 22:40
    查看更多