【问题标题】:Why does CMake EXPORT require static libraries used to build a shared library?为什么 CMake EXPORT 需要用于构建共享库的静态库?
【发布时间】:2017-03-04 04:30:39
【问题描述】:

我试图让其他项目更容易链接到我们随项目分发的共享库。当我尝试利用 EXPORT 机制时,CMake 抱怨说我没有在导出集中包含用于构建共享库的静态库。这对我来说似乎没有必要,因为其他项目只需要链接到共享库,我真的不想安装静态库。这似乎与this bug 非常相似,但我可能只是误解了这一切是如何运作的。这是一个最小的例子:

CMAKE_MINIMUM_REQUIRED(VERSION 3.2.1) 
PROJECT(ExportTest)

ADD_LIBRARY(myStaticLib STATIC staticLib.c)
ADD_LIBRARY(mySharedLib SHARED sharedLib.c)
TARGET_LINK_LIBRARIES(mySharedLib myStaticLib)

INSTALL(TARGETS mySharedLib EXPORT myExport DESTINATION lib)
INSTALL(EXPORT myExport DESTINATION include)

这会导致以下错误消息:

CMake Error: install(EXPORT "myExport" ...) includes target "mySharedLib"
which requires target "myStaticLib" that is not in the export set.

【问题讨论】:

  • 因为在 Linux 上,默认情况下共享库不是“完整的”,当链接可执行文件时,仍然需要“传递”静态库。

标签: cmake shared-libraries static-libraries


【解决方案1】:

当像你一样使用target_link_libraries 时,默认情况下库依赖是传递的。试试:

target_link_libraries(mySharedLib PRIVATE myStaticLib)

【讨论】:

  • 谢谢,这确实解决了错误。您能帮我理解为什么您希望将静态库视为共享库的依赖项吗?这似乎是奇怪的默认行为。
  • target_link_libraries 不仅管理链接的依赖关系,还管理包含的依赖关系。考虑到静态库上的链接意味着共享库不会在其公共接口中包含静态库的标头,这是一个非常强大的先验。 cmake 的开发人员选择在这一点上不可知论,同时提供显式签名来控制依赖关系
  • 我在尝试将对象库链接到静态库时遇到了类似的错误。但是,将对象库目标安装到导出而不指定目标(您将使用 install 命令的 OBJECTS 参数执行此操作)会将对象库安装为接口库。实际上没有安装任何对象,但这足以解决传递性使用要求。请参阅docs 中的本节末尾
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多