【问题标题】:CMake add_library containing other librariesCMake add_library 包含其他库
【发布时间】:2017-07-25 13:54:17
【问题描述】:

我正在设计一组可以链接到我的其他 C++ 项目中的库。为了使集合易于使用,我希望能够链接到各个库,或者链接到包含所有其他库的主库。如何在 CMakeLists.txt 文件中指定它?

例如:

add_library(library1 SHARED
    file1.cpp
    file2.cpp
)

add_library(library2 SHARED
    file3.cpp
    file4.cpp
)

# Define a master library that contains both of the others
add_library(master_library SHARED
    library1
    library2
)

是否有适当的方法来使用 CMake 获得此功能?


编辑:

这个问题不是重复的:CMake: Is it possible to build an executable from only static libraries and no source?

这仅与共享库有关,与静态库或可执行文件无关。

【问题讨论】:

  • 如果您只是要将它们“合并”成一个“主”库,为什么还要有两个不同的库?除非您有其他依赖于其他库的其他目标,否则只需从其他库的源创建 singlemaster_library,而根本没有其他库。跨度>
  • 这就是我想要拥有独立库的确切原因。有些程序只依赖于较小的库,而需要所有功能的较大程序可以链接到主库,而不必链接到所有较小的库
  • 拥有这个合并的“主”库只会使用磁盘上不需要的额外空间。当需要这两个库时,请同时使用这两个库。它也会让其他人更清楚。
  • 在更大的规模上可能会有更多的小型库,因此单独链接到所有这些库需要大量额外的工作

标签: c++ cmake shared-libraries


【解决方案1】:

这个解决方案似乎有效。

add_library(library1 SHARED
    file1.cpp
    file2.cpp
)

add_library(library2 SHARED
    file3.cpp
    file4.cpp
)

# dummy file is required to avoid a cmake error, but this
# "dummy" file serves no other purpose and is empty.
add_library(master_library SHARED
    dummy.cpp
)

# Link the master library with the other libraries
target_link_libraries(master_library
    library1
    library2
)

完成此操作后,我能够仅使用主库编译和链接代码。

【讨论】:

  • 这并不完全一样,任何人都可以提出这样的建议,因为依赖关系仍然存在。如果没有 library1 和 library2,你不能分发任何使用“master_library”的东西——至少不能在 Windows 等某些平台上。
  • @utopia 所有的库都是同一个 cmake 项目的一部分,所以部署它的任何地方library1library2master_library 都将在那里。这使您只能链接到master_library,它基本上是链接到其他 2 的快捷方式。这几乎就是我想要的。
【解决方案2】:

只需在您的项目中创建一个函数:

function(link_all_libs TARGET)
    target_link_libraries(TARGET library1 library2)
endfunction(link_all_libs)

现在你可以简单地:

link_all_libs(myapp)

【讨论】:

  • 这仍然必须在链接主库的项目的CMakeLists.txt 文件中,因此它基本上与单独链接它们相同。我基本上希望链接到主库的项目只需要了解主库而无需了解其他库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
相关资源
最近更新 更多