【问题标题】:Modern CMake - setup libraries targets inside project现代 CMake - 在项目内设置库目标
【发布时间】:2018-07-10 17:08:15
【问题描述】:

我的项目结构如下:

── src
    ├── app
    │   ├── first_app
    │   │   ├── include
    │   │   └── src
    │   │   └── CMakeLists.txt
    │   ├── second_app
    │   │   └── ...
    ├── lib 
    │   ├── first_lib
    │   |   ├── include
    │   |   └── src
    │   |   └── CMakeLists.txt
    │   ├── second_lib
    │   |   ├── include
    │   |   └── src
    │   |   └── CMakeLists.txt
    ├── CMakeLists.txt

first_app 使用 first_libsecond_lib。我想强制 CMake 使用

查找所有依赖项(库和包含头文件)

target_link_libraries(first_app first_lib::first_lib second_lib::second_lib)

我想问两个问题:

  1. 应该使用什么命令来导出./src/lib/first_lib/CMakeLists.txt中的first_lib::first_lib
  2. 如何使 first_lib::first_lib 在 ./src/app/first_app/CMakeLists.txt 中可见

【问题讨论】:

    标签: cmake


    【解决方案1】:

    假设你使用add_library(first_lib ...) 创建你的库

    1) 我会使用:

    include(GNUInstallDirs)
    install(TARGETS first_lib
      EXPORT FirstLibTargets
      PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/first_lib
      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    )
    

    源代码:https://github.com/Mizux/cmake-cpp/blob/master/Foo/CMakeLists.txt#L24 然后您可以使用以下命令安装导出文件:

    install(EXPORT FirstLibTargets
     NAMESPACE first_lib::
     DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/FirstLib
     COMPONENT Devel)
    

    src:https://github.com/Mizux/cmake-cpp/blob/master/CMakeLists.txt

    注意:我不知道您是否可以安装目标别名(即install(TARGETS first_lib::first_lib)和/或具有不同命名空间的导出文件(即first_lib::second_lib::

    2) 只需在 first_lib/CMakeLists.txt 中使用: add_library(first_lib::first_lib ALIAS first_lib) 就在您的 add_library 之后。

    因此,如果您使用 Meta CMake(即 add_subdirectory())或 find_package(),first_app 始终可以使用 first_lib::first-lib 来检索此目标依赖项。 例如https://github.com/Mizux/cmake-cpp/blob/master/Foo/CMakeLists.txt

    【讨论】:

    • 感谢 Mizux Dev 提供的解决方案。它完全按照我的意愿工作。
    猜你喜欢
    • 2018-02-07
    • 2021-10-23
    • 2023-01-25
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多