首页  >  文章  >  后端开发  >  如何有效管理 CMake 中的依赖关系:本地依赖关系、库目标和项目结构指南?

如何有效管理 CMake 中的依赖关系:本地依赖关系、库目标和项目结构指南?

Barbara Streisand
Barbara Streisand原创
2024-11-05 05:26:02502浏览

How to Effectively Manage Dependencies in CMake: A Guide to Local Dependencies, Library Targets, and Project Structure?

CMake 中的依赖关系管理:源、库和 CMakeLists.txt

在 CMake 中,管理源文件、库和 CMakeLists 之间的依赖关系.txt 确保项目结构良好且高效。本文探讨了在涉及多个库和可执行文件的复杂项目中有效处理依赖关系的策略。

本地依赖关系:优势

设置本地依赖关系通过指定来简化依赖关系管理每个子目录的 CMakeLists.txt 中源和链接级别的依赖项。这种方法提供了清晰的层次结构,并通过排除不相关的依赖项来避免不必要的膨胀。

示例项目结构和 CMakeLists.txt

考虑一个具有互连库和可执行文件的项目:

Lib
  - LibA
    - CMakeLists.txt
    - Src
      - a.cc
    - Inc
      - a.h
  - LibB
    - CMakeLists.txt
    - Src
      - b.cc
    - Inc
      - b.h
  - LibC
    - CMakeLists.txt
    - Src
      - c.cc
    - Inc
      - c.h

App1
  - CMakeLists.txt
  - Src
    - main.cc

库 CMakeLists.txt(LibA、LibB、LibC)

include_directories(Inc ../LibC/Inc)
add_subdirectory(../LibC LibC)
add_library(LibA Src/a.cc Inc/a.h)
target_link_libraries(LibA LibC)

include_directories(Inc)
add_library(LibB Src/b.cc Inc/b.h)

include_directories(Inc ../LibB/Inc)
add_subdirectory(../LibB LibB)
add_library(LibC Src/c.cc Inc/c.h)
target_link_libraries(LibC LibB)

App1 CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(App1 CXX)

file(WRITE "Src/main.cc" "#include \"a.h\"\n#include \"b.h\"\nint main()\n{\na();\nb();\nreturn 0;\n}")
...
include_directories(../Lib/LibA/Inc ../Lib/LibB/Inc)
add_subdirectory(../Lib/LibA LibA)
add_subdirectory(../Lib/LibB LibB)
add_executable(App1 Src/main.cc)
target_link_libraries(App1 LibA LibB)

库依赖关系图

此项目的依赖关系图:App1 -> LibA-> LibC-> LibB 应用程序1 -> LibB

管理多个依赖项的策略

存在多种管理多个依赖项的方法:

  1. 在同一项目中构建库:
    此方法将库和可执行文件合并在同一项目中,从而促进依赖关系解析。
  2. 在单独的项目中构建库:
    对于静态的、不经常修改的库,可能会首选此策略,以避免主项目混乱。

最佳实践

  • 创建包含标头和库的全功能库目标路径。
  • 在 target_link_libraries 中使用 PUBLIC/PRIVATE 修饰符来控制标头包含可见性。
  • 利用 find_package 命令来管理与外部预构建库的依赖关系。

以上是如何有效管理 CMake 中的依赖关系:本地依赖关系、库目标和项目结构指南?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn