【问题标题】:CMake: how to install only shared libraries found via find_library?CMake:如何仅安装通过 find_library 找到的共享库?
【发布时间】:2018-02-07 19:31:07
【问题描述】:

我有几个第三方库,有些是共享的,有些是静态的,我需要安装共享的。

目前我正在做 find_library,列出所有需要的库并将其传递给 install(FILES ...)

但是这样.a.so 库都被安装了。

install(TARGETS ...)RUNTIMEARCHIVE 等上有一个分隔符。 但我不想为每个库创建一个虚拟目标。

我也不想将库分为共享库和静态库(已经有另一种分离)。

我是否有更好的方法来过滤共享库,而不仅仅是正则表达式文件名?也许库在find_library 之后被视为“更多”的东西,而不仅仅是文件路径,所以我可以从它们那里获取库类型?

【问题讨论】:

  • Maybe libraries are treated as something 'more' than just filepaths after find_library so I somehow can get library type from them? - 不,find_library 只是返回一个路径。它不知道库是静态的还是共享的。用正则表达式检查库的类型有什么问题?您可以使用变量CMAKE_SHARED_LIBRARY_SUFFIX 使检查跨平台。
  • @Tsyvarev 我不知道 :D 总的来说它看起来很笨重,但我想这正是 CMake 的作用:)
  • 我认为存在误解。 find_library 是获取路径,以便您可以链接到该库。它并不意味着包含用于打包或安装的外部库。
  • @usr1234567 好吧,那我该怎么做呢? :) 我需要找到下载的库并安装它
  • 使用其他工具。可能 Docker、虚拟机或类似方法可能会对您有所帮助。 CMake 似乎不适合您的用例。

标签: cmake installation shared-libraries static-libraries


【解决方案1】:

让我们看看发生了什么。

  1. 您通过包管理器安装一些库 (yum/dnf/apt-get/sth else)。
  2. 您构建您的应用程序。
  3. 您分发您的应用程序。

如果是这样,您不应该要求 cmake 安装这些库,因为如果其他人想通过另一个 rpm 包安装相同的第三方库,则会产生冲突(并且必须删除一个包) - 这很混乱。

管理库依赖的地方是包管理器 - 创建 rpm 包,它将具有:

Requires: all_your_dynamic_libs
BuildRequires: all_your_static_libs

如果第 1 点是宁可 - 你通过 make && make install 安装一些库,那么你应该首先为此创建 rpm 包。

创建所有这些额外的工作有点痛苦,但相信我,你不想创建多合一的包。

【讨论】:

  • 我们提供定制硬件、定制操作系统构建,我们在其上安装大量定制软件(需要一些动态库才能工作),以及所有旨在工作的东西(安装后我们的 RPMs) 原样,没有来自客户的任何询问。我的意思是,不能保证客户可以访问存储库,更不用说互联网了。他们应该从哪里下载库?我正在通过 CMake 的 ExternalProject 从本地 Artifactory 服务器将库下载到 CI 服务器。
  • 顺便说一句,即使客户可以从第三方自己下载库,也可能存在访问缺失或不完美的版本匹配(好吧,我想我们可以强制执行)它用于这个)并且我们的一些软件可能会因此而崩溃;应该有一个解决方案,让客户不依赖任何第三方,更不用说互联网了
  • 为什么不以与操作系统/应用程序相同的方式部署这些库?我敢打赌,您正在准备操作系统映像,然后将其部署到硬件上?因此,您应该与您的应用程序和这些第三方库一起创建此映像。更重要的是,您可以检查 Yocto 项目 - 它似乎与您正在寻找的东西完全一样。我会在 stackoverflow 上问另一个问题——关于将整个操作系统交付到硬件上。我不是将软件部署到嵌入式的专家。它超出了您最初问题的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
相关资源
最近更新 更多