gpt4 book ai didi

cmake - 多个子项目依赖于同一个库

转载 作者:行者123 更新时间:2023-12-01 06:58:31 33 4
gpt4 key购买 nike

我有一个项目main_project .它依赖于两个库 - libAlibB , 而这又取决于 lib_common每个。

以图形方式项目的结构如下所示:

main_project
|
+-libA
| |
| +-CMakeLists.txt
|
+-libB
| |
| +-CMakeLists.txt
|
+-lib_common
| |
| +-CMakeLists.txt
|
+-CMakeLists.txt

由于 libA使用 lib_common调用 add_subdirectory(lib_common) 很自然里面 libACMakeLists.txt .但是 libB还取决于 lib_common .如果我再次将它放在子目录中,它将编译两次。我不希望那样。我也想保持我所有的子项目干净和独立 - 这就是为什么我不想把 lib_common在顶层 main_projectCMakeLists.txt (因为 lib_commonmain_project 没有任何关系)。

我有哪些选择?

最佳答案

我会在您的项目结构中再添加一个抽象级别:

  • app - 这适用于可执行文件和属于它们的所有内容,
  • lib - 应用程序库。

  • 顶级 CMakeLists.txt只会知道有两个不同的东西, app子项目和 lib子项目。一个示例目录结构可能如下所示:
    FooProject
    |-- app
    |   |-- CMakeLists.txt
    |   `-- src
    |   `-- foo.cpp
    |-- CMakeLists.txt
    `-- lib
    |-- CMakeLists.txt
    |-- libA
    |   |-- CMakeLists.txt
    |   |-- inc
    |   |   `-- bar.h
    |   `-- src
    |   `-- bar.cpp
    |-- libB
    |   |-- CMakeLists.txt
    |   |-- inc
    |   |   `-- baz.h
    |   `-- src
    |   `-- baz.cpp
    `-- lib_common
    |-- CMakeLists.txt
    |-- inc
    |   `-- common_tool.h
    `-- src
    `-- common_tool.cpp

    顶级 CMakeLists.txt仅包含以下内容:
    cmake_minimum_required(VERSION 2.8)
    project(FooProject)

    add_subdirectory(lib)
    add_subdirectory(app)
    app/CMakeLists.txt应该知道有一个 lib可以在其中包含标题的文件夹,并且可执行文件取决于 libAlibB :
    project(foo)

    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../lib)
    aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src FOO_SOURCES)

    add_executable(foo ${FOO_SOURCES})
    add_dependencies(foo libA libB)
    target_link_libraries(foo libA libB)

    install(TARGETS foo RUNTIME DESTINATION bin ARCHIVE DESTINATION bin)
    lib/CMakeLists.txt存在是为了将 libA 联系在一起, libBlib_common :
    cmake_minimum_required(VERSION 2.8)

    add_subdirectory(lib_common)
    add_subdirectory(libA)
    add_subdirectory(libB)

    假设 lib_common没有依赖关系,所以 lib/lib_common/CMakeLists.txt不会在其文件夹之外看到:
    project(lib_common)

    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
    aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src LIBCOMMON_SOURCES)

    add_library(lib_common ${LIBCOMMON_SOURCES})

    在此示例中, lib/libA/CMakeLists.txtlib/libB/CMakeLists.txt具有几乎相同的内容,只有它们处理 lib_common :
    project(libA)

    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc ${CMAKE_CURRENT_SOURCE_DIR}/..)
    aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src LIBA_SOURCES)

    add_library(libA ${LIBA_SOURCES})
    add_dependencies(libA lib_common)
    target_link_libraries(libA lib_common)

    install(TARGETS libA LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)

    在此示例中, lib子项目是你可以称之为干净和独立的。

    关于cmake - 多个子项目依赖于同一个库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44849511/

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