【问题标题】:CMake - How to export a library with private dependenciesCMake - 如何导出具有私有依赖项的库
【发布时间】:2017-11-29 05:02:35
【问题描述】:

我正在尝试从 CMake 项目中导出库。在内部,我已将此库分解为多个子目标。我现在只想导出完整的公共图书馆,而不需要我的私人图书馆二进制文件。以下不起作用。

cmake_minimum_required(VERSION 3.2)

project(export-mwe)

add_library(priv priv.cpp)

add_library(exp-lib exp-lib.cpp)
target_link_libraries(exp-lib PRIVATE priv)

install(TARGETS exp-lib EXPORT export-mwe DESTINATION lib)

install(EXPORT export-mwe DESTINATION .)

当我尝试生成这个项目时,我得到了一个错误。

CMake Error: install(EXPORT "export-mwe" ...) includes target "exp-lib" which requires target "priv" that is not in the export set.

如何在这个例子中只导出exp-lib,而不用导出priv

【问题讨论】:

  • 无法导出依赖项不足的库接口。您将不得不编写一个包配置文件。参见 cmake-buildsystem(7) 和 cmake-packages(7)。

标签: cmake


【解决方案1】:

如果您将您的库exp-lib 与另一个共享priv 链接(甚至是私下链接),CMake 需要在将其他可执行文件与您的主库链接时注意该链接。所以,私链的信息是stored in the export file:

... 告诉导入的 CMake 它需要确保链接器可以 当应用程序链接到 B 时找到 A,即使 A 不会出现 在链接线上。

至于

如何在这个例子中只导出 exp-lib,而不用导出 priv?

制作priv静态。有关与静态库的私有链接的信息未存储在导出文件中。

【讨论】:

  • 默认不是 STATIC 吗?
  • 嗯,最有可能的库默认为 STATIC。我刚刚在我的机器(Linux,CMake 3.4.1)上测试了你的代码,得到了非常奇怪的结果: 1. 当且仅当exp-libSTATIC (!!),priv 库的类型对此没有影响。 2. 对于exp-libpriv 库,STATIC / SHARED 的任意组合都不会生成错误或警告。
  • 如果priv 是由add_library(INTERFACE) 后跟target_include_directories(INTERFACE) 定义的仅标头库怎么办?它不应该从导出文件中排除吗?我有这种情况,cmake 在错误消息中告诉我我也必须导出 priv。
  • "... cmake 在错误消息中告诉我,我也必须导出 priv。"- 只需按照 CMake 告诉您的操作即可。与普通库一样,INTERFACE 库也可以导出和安装。
  • 正如 John 所说,STATIC 是默认设置,我可以确认这不能解决问题(使用 CMake 3.10.2)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多