gpt4 book ai didi

c++ - 处理具有多个子项目的 CMake 项目的依赖关系

转载 作者:行者123 更新时间:2023-12-05 06:49:36 31 4
gpt4 key购买 nike

我的项目结构如下:

    ├── CMakeLists.txt
├── libA
│   ├── CMakeLists.txt
│   ├── include
│   │   └── libA
│   │   └── my_liba.h
│   ├── src
│   │   └── my_liba.cpp
│   └── test
├── libB
│   ├── CMakeLists.txt
│   ├── include
│   │   └── libB
│   │   └── my_libb.h
│   ├── src
│   │   └── my_libb.cpp
│   └── test
└── runner
├── CMakeLists.txt
└── src
└── main.cpp

我想实现以下目标:

  • 能够分别构建libAlibB 以及Runner
  • 能够一起构建。

对于依赖:libB依赖于libARunner需要libB。我必须如何配置 libB 和 Runner?

这些是当前的 CMakeLists.txt 文件:

libA/CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project (MyLibA)

add_library(${PROJECT_NAME} src/my_liba.cpp)
add_library(Example::LibA ALIAS ${PROJECT_NAME})

target_include_directories( ${PROJECT_NAME}
PUBLIC ${PROJECT_SOURCE_DIR}/include
)

libB/CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project (MyLibB)

add_library(${PROJECT_NAME} src/my_libb.cpp)
add_library(Example::LibB ALIAS ${PROJECT_NAME})

target_link_libraries(${PROJECT_NAME} PRIVATE Example::LibA)

target_include_directories( ${PROJECT_NAME}
PUBLIC ${PROJECT_SOURCE_DIR}/include
)

Runner/CMakeLists.txt

project(runner)

add_executable(${PROJECT_NAME} src/main.cpp)

target_link_libraries(${PROJECT_NAME}
Example::LibB
)

CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)

project(Example)

add_subdirectory(libA)
add_subdirectory(libB)
add_subdirectory(runner)

使用当前配置,我可以从 lib 目录构建所有内容。我还可以从 libA 目录中构建 libA。但是我无法从那里的文件夹构建 libBrunner,这是意料之中的,因为他们不知道在哪里可以找到依赖项。

我必须如何更改我的 CMakeFiles 才能让它工作?

最佳答案

如果您希望能够仅使用 libB 构建脚本来构建 libB,您需要一种方法让 libB 能够找到libA 依赖。

根据你的问题,我假设你实际上想构建 libA 作为 libB 构建过程的一部分(你不想安装 libA 在开始 libB 构建之前。

这看起来很奇怪,但您可以在 libB/CMakeLists.txt 中执行此操作:

add_subdirectory(../libA)

问题是这样做会破坏根构建脚本。这可以通过检查 libA 目标是否已经存在来解决:

if (NOT TARGET libA)
add_subdirectory(../libA)
endif (NOT TARGET libA)

这样,您要么拥有一个 libA 目标,因为根构建脚本添加了 libA 子目录,要么您自己添加它。

add_subdirectory(../libA) 对我来说看起来很奇怪,可能一些有更多 CMake 经验的人会认为它是糟糕的风格,但我在这里看不到其他选项,考虑到您的设置。如果您这样做,其他东西可能会损坏,请参阅 this question .

作为旁注,您可能希望在目标之间添加一些依赖关系:

add_dependencies(libB libA)

这样,在构建libB时,如果没有构建libA,则会在之前触发libA构建libB 构建开始。

关于c++ - 处理具有多个子项目的 CMake 项目的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66590687/

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