【问题标题】:CMakeLists with multiple CMakeLists under it in build tree构建树中具有多个 CMakeLists 的 CMakeLists
【发布时间】:2020-05-01 00:30:28
【问题描述】:

我有以下树:

/all-targets
----CMakeLists.txt
----/target1
--------CMakeLists.txt
--------/include
--------/src
----/target2
--------CMakeLists.txt
--------/include
--------/src
----/target3
--------CMakeLists.txt
--------/include
--------/src

顶级 CMake 应该能够将所有目标链接在一起,而无需生成任何可执行文件或库文件,只生成具有正确结构/树的任何项目类型

target1 需要具有来自 target2 的库/对象文件,以便可以编译。

我读过这些:1.Multiple CMakeLists 2.CMake - Depending on another cmake project

我现在理解的是在顶层 CMakeLists.txt 我可以添加 add-subdirectory 命令来添加 target1、target2 和 target3(子目录),但我仍然不明白我应该在 /target1 中添加什么/CmakeLists.txt 以便它可以与 target2 库文件链接?我不认为它是add-subdirectory,因为在这种情况下,target2 目录是兄弟目录而不是子目录。

顶级 CmakeLists.txt 文件是否理解我只想创建将目标链接在一起的项目文件而没有输出(可执行文件 - 库)。

【问题讨论】:

  • 这些是什么类型的目标?它们都是独立的可执行文件吗?静态库?它们是单独使用还是在最终的顶级可执行文件/库中链接在一起?
  • "我应该在 /target1/CmakeLists.txt 中添加什么以便它可以与 target2 库文件链接?" - 假设您在对应目录中创建了目标target1target2,则需要添加target_link_libraries(target1 target2)。 “顶级CMake应该能够将所有目标链接在一起而不产生任何可执行文件或库文件” - 我不明白这一点。 链接 是产生某些东西(可执行文件或库)的过程的一部分。您能否将CMakeLists.txt 文件的上下文添加到问题帖子中?这有助于了解您的意图。
  • @Botje 是的,它们是独立的可执行文件,也可以与其他目标一起用作静态库,它们也将单独使用,并与顶层一起使用。 (顶层只是产生.即包含所有这些目标的xcode项目
  • @Tsyvarev 我的意思是顶级CMakeLists.txt 应该能够产生.i.e. Xcode 项目包含所有目标一起。如果我能够以正确的方式解释我的想法,我不会:\

标签: c++ cmake


【解决方案1】:

你没有给我们太多的帮助,但我可以提供一个大致的想法。

顶级 CMakeLists 只是在各种目标上调用 add_subdirectory。这些应该被排序,使得没有目标依赖于目标之后

对于 target1,您可以拥有以下内容:

add_library(target1_common STATIC oven.cpp pan.cpp tray.cpp)
target_include_directories(target1_common PUBLIC include)
add_executable(target1 target1_main.cpp)
target_link_libraries(target1 PRIVATE target1_common)

你说target2依赖于target1的某些部分,所以:

add_library(target2_common STATIC table.cpp chair.cpp plate.cpp)
target_include_directories(target2_common PUBLIC include)
target_link_libraries(target2_common PUBLIC target1_common)

add_executable(target2 target2_main.cpp)
target_link_libaries(target2 PRIVATE target2_common)

可执行文件链接到PRIVATE,因为您不会进一步链接到它们,但PUBLIC 也可以工作。

编辑:添加了自动填充 target1_commontarget2_common 的标题搜索路径的 target_include_directories 语句

【讨论】:

  • 所以如果我只添加target_link_libraries(target2_common PUBLIC target1_common)/target2/CMakeLists.txt 将搜索target1_common 而不指定搜索路径对吗?
  • 不确定您所说的“搜索”是什么意思。 CMake 将编译静态库 target1_common 并将其标记为 target2_common 的依赖项,以供链接到 target2 时使用。
  • 如果我需要包含 target1_common 的标题怎么办?您添加的命令将获得 target1_common 的标头?
  • 是的。 PUBLIC 和 INTERFACE 包含路径在链接时传播。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多