【问题标题】:How to group multiple library targets into one in CMake如何在 CMake 中将多个库目标分组为一个
【发布时间】:2019-06-12 18:45:01
【问题描述】:

我正在尝试将多个目标组合成一个目标,因此下游用户只需链接到该单个目标。下游用户不需要查找所有目标,并且上游库中的所有功能都可以通过链接到该单个目标来使用。请参阅下面我失败的尝试的 CMakeLists。

cmake_minimum_required(VERSION 3.11)
project(modules)

# 10 libraries with actually functionality
add_subdirectory(mylib1)
add_subdirectory(mylib2)
...
add_subdirectory(mylib10)

# failed attempt to create a single library that links to the above 10
add_library(myliball)

target_link_libraries(myliball mylib1 mylib2 ... mylib10)

install(TARGETS myliball
        EXPORT ${CMAKE_PROJECT_NAME}Targets
        ARCHIVE DESTINATION lib
        LIBRARY DESTINATION lib
        RUNTIME DESTINATION bin)

export(TARGETS myliball
      APPEND FILE ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}Targets.cmake)

当我运行 cmake 时,它​​会显示此错误

No SOURCES given to target: myliball

我可能可以为 myliball 创建一个空类来解决这个问题,但这似乎很混乱。有没有更好的方法来做到这一点?

【问题讨论】:

  • 您可能应该将目标称为“静态库”
  • 不,它不仅仅是静态库。 “目标”包括INTERFACE_COMPILE_DEFINITIONSINTERFACE_COMPILE_FEATURESINTERFACE_INCLUDE_DIRECTORIESINTERFACE_LINK_LIBRARIES等信息
  • @drescherjm 您链接的那个不同,这应该适用于动态库,并且也没有适当的解决方案来解决他们的问题。
  • @Tsyvarev 按照您的建议更新了标题

标签: cmake


【解决方案1】:

CMake 有一种特殊类型的库目标,用于分组 - INTERFACE

add_library(myliball INTERFACE)

target_link_libraries(myliball INTERFACE mylib1 mylib2 ... mylib10)

此类库目标未编译,它仅用于在链接时传播其 INTERFACE 属性。

【讨论】:

  • 按我的意愿工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
相关资源
最近更新 更多