【问题标题】:CMake build git submodules and its dependenciesCMake 构建 git 子模块及其依赖项
【发布时间】:2021-12-25 13:41:11
【问题描述】:

我是 CMake 的新手,

我想在我的 CMake 项目中使用 C++ 库 A。 这个库 A 作为一个 git 子模块包含在我的 CMakeFile 中,使用

add_subdirectory("extern/A")

到目前为止有效。

但是,我的库 A 有两个其他依赖项 BC。它们包含在库 A 的 CMakeFile 中,使用 find_package()

现在,我希望 CMake 构建这些依赖项 BC,以便库 A 可以使用它们。我也想将 BC 作为 git 子模块。

简单连接

add_subdirectory("extern/B")
add_subdirectory("extern/C")
add_subdirectory("extern/A")

显然不起作用。我认为在这里使用 add_dependencies 可以有所帮助,但我还没有找到让它工作的方法......

甚至可以在这里做我想做的事吗?如果是,有人可以提示我可能需要使用哪些命令吗?

【问题讨论】:

  • 为什么 add_subdirectory() 不起作用并不明显。这些依赖项没有 CMakeLists.txt
  • @drescherjm 这些依赖都有一个 CMakeLists.txt。我得到的错误是CMake Error in extern/A/src/A/CMakeLists.txt: export called with target "A" which requires target "B" that is not in any export set.

标签: c++ cmake git-submodules


【解决方案1】:

您的错误是将B 作为依赖项添加到RootProjectA 需要它的地方。

解决方案:

假设如下目录结构

RootProject
|__.git
|__CMakeLists.txt
|__src
|___(source files)
|__vendor
|___A
|____.git
|____CMakeLists.txt
|____src
|_____(source files)

在哪里

  • RootProject 依赖于 A
  • A 是一个没有依赖关系的库。

现在,如果您想将 B 添加为 A 的依赖项,您可以将 A 视为单独的项目并直接将 B 添加到它(使用 git 子模块),您可以这样做:

cd vendor/A
git submodule add https://github.com/username/repo.git vendor/B

这会将B 添加为A 的依赖项,而不是RootProject

现在只需将以下内容添加到vendor/A/CMakeLists.txt

add_subdirectory("vendor/B")
# ......
target_link_libraries(A PUBLIC B)

另请注意,ABRootProject 中的每一个都必须有一个 CMakeLists.txt

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2014-02-17
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多