【问题标题】:CMake multiple projects using same libraryCMake 使用同一个库的多个项目
【发布时间】:2017-04-07 23:10:20
【问题描述】:

在 CMake 中构建(不是一次)使用相同库的多个项目的做法是什么?据我所知,在 CMake 中人们倾向于使用子目录方法。但是如果没有库源重复,库就不能成为多个项目的真正子目录。还有一种顶级 CMakeLists.txt 方法,但我认为这不是一个好的解决方案,因为您必须为每个项目创建它,并且它必须是项目目录的上一级,它不能很好地与源代码控制配合使用(像 GIT),您希望为单个项目提供单个存储库/目录。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    CMake 是一个跨平台制作工具,用于“制作”一个项目,包括包含的子项目。因此,源要么是这个结构的一部分,要么不是。但恕我直言,cmake 并不是管理一个主要项目树中所有项目的工具。

    我的方法是建立独立的项目。每个项目都会构建库、测试、文档并将其安装到项目存储中。如果其他库或应用程序需要这些库之一,则在该项目的 cmake 文件中引用它。

    因此项目的发布是独立的,项目更小,可以根据需要组合。

    我使用脚本来构建应用程序中的所有库。不过这个可以用cmake来代替。

    • 让最顶层项目的构建依赖于库的构建
    • 将自定义命令添加到大多数顶级项目中以触发引用库的构建。

    可能的解决方案:

    add_custom_command(TARGET myapp PRE_LINK
                       COMMAND cd /mypath/libA && mkdir build && cd build && cmake ../source && make install)
    add_custom_command(TARGET myapp PRE_LINK
                       COMMAND cd /mypath/libB && mkdir build && cd build && cmake ../source && make install)
    add_executable(myapp ${SOURCES})
    

    【讨论】:

    • 我同意你关于使用多个项目的观点,这就是我的意思。 “每个项目都构建库” - 但是如果它没有放在项目的子目录中,它如何构建库?我不能在多个项目中放置相同的库源。通过使用以下 add_subdirectory 调用将库包含到项目构建中来“愚弄”CMake 是一种不好的做法吗?:add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../common_library", "${CMAKE_CURRENT_SOURCE_DIR}/../common_library/build")
    • AFAIK 不可能离开 cmake 树(上次尝试一些版本之前)。但是为什么不 cmake + make + make install 基础库。然后在依赖的 CMakeLists.txt 中包含 find_library mylibfind_package mypackage?你已经 find_library 出来了吗?
    • 我的项目使用了很多库,我想一次构建它们而不是单独构建它们,并自己考虑依赖关系。使用 add_subdirectory 的方法至少从一开始就有效,但感觉与 CMake 有点矛盾:) 不知道您所说的“你已经找到 find_library 了吗?”,如果我用它构建,我不必使用 find_library添加_子目录。
    • 谢谢!我不喜欢使用自定义命令或使用脚本的事情是您必须自己管理库位置和包含。同样对于顶级方法和子目录,存在我在最初的问题中提到的问题 - 库代码重复或不属于任何存储库的人工顶级 CMakeLists.txt。
    • 我想我会坚持使用 add_subdirectory(...) 方法/hack,因为这样你就可以在库 CMakeLists.txt 和其他项目中指定接口和库位置,你可以调用target_link_libraries(proj, lib),它会自动添加包含和库。
    【解决方案2】:

    我实际上在这里找到了一个可以接受的解决方案: http://www.mail-archive.com/cmake@cmake.org/msg39062.html 它有点类似于在add_subdirectory 中指定上级目录的想法,但不会污染项目的 CMakeLists.txt 文件,而是通过 CMake 参数传递依赖的项目路径。这样项目的 CMakeLists.txt 文件似乎遵循普通的 CMake 子目录层次结构。我必须说 CMake 以某种方式强迫我们使用子目录层次结构感觉有点不对劲,但我不知道这背后的所有原因,所以可能没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多