gpt4 book ai didi

c++ - 在cmake中,如何以可伸缩的方式指定子目录的依赖关系?

转载 作者:太空狗 更新时间:2023-10-29 21:05:39 25 4
gpt4 key购买 nike

假设源码树是这样的结构:

/
|- lib1
| |- src.cpp
| |- lib1.h
| |- CMakeLists.txt
|
|- lib2
| |- src.cpp
| |- lib2.h
| |- CMakeLists.txt
|
|- lib3
| |- src.cpp
| |- lib3.h
| |- CMakeLists.txt
|
|- app
| |- src.cpp
| |- CMakeLists.txt
|
|- CMakeLists.txt

假设:

  1. lib1 有函数 f();
  2. lib2 有函数 g(),它使用 f();
  3. app/src.cpp 使用函数 g();
  4. 没有人使用 lib3。

我要:

  1. 在 app/CMakeLists.txt 中,它只链接到 lib2。这里的逻辑是,app/src.cpp 只使用了g(),所以在写app/src.cpp 时,我们不能指定对lib1 的依赖,因为它是lib2 的实现细节。所以按照这个逻辑,在app/CMakeLists.txt中,它不能有任何与lib1相关的东西,即它既没有lib1的include_directories,lib1的add_subdirectory,也没有lib1的target_link_libraries等。
  2. 因为没有人使用 lib3,所以它甚至不会被构建。这需要自动完成。因此,为 lib1 和 lib2 而不是 lib3 手动添加子目录并不是一个聪明的方法。你可以想象一下,如果我们有一个非常大的源代码树,树结构和依赖关系复杂,数百个可执行文件位于数百个不同的子目录中。如果我只想构建其中的几个,那么我根本不想费心构建未使用的库。

所以我的问题是:有没有办法以可扩展的方式编写 CMakeLists.txt 文件以满足上述要求?如果没有,那么是否有一些类似的工具可以做到这一点?

谢谢。

最佳答案

对于第一个问题:

lib2/CMakeLists.txt 中你应该把这个:

target_link_libraries(lib2 lib1)

在 app/CMakeLists.txt 中:

target_link_libraries(app lib2)

现在,如果您尝试构建应用程序,CMake 将检查 lib2 是否是最新的,如果不是,则重建 lib1 和 lib2。

对于第二个问题:

您可以使用基于 option() 变量的 if() block 来保护 add_subdirectory(lib3) 调用。

另一种方式 - 在 lib3/CMakeLists.txt 中:

add_library(lib3 ${SRCS} EXCLUDE_FROM_ALL)

这将使 CMake 不将 lib3 目标添加到 all 目标中。如果您尝试构建依赖于它的东西,或者手动发出 make lib3,这个目标仍然会被构建。

关于c++ - 在cmake中,如何以可伸缩的方式指定子目录的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9439865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com