CMake - 将多个库合并为一个

2024-02-02

假设我有可执行文件 A、B、C,并且有外部库 X、Y、Z

SET(EXTERNAL_LIB X Y Z)
TARGET_LINK_LIBRARIES(A, ${EXTERNAL_LIB})
TARGET_LINK_LIBRARIES(B, ${EXTERNAL_LIB})
TARGET_LINK_LIBRARIES(C, ${EXTERNAL_LIB})

但是,如果我想象这一点(使用cmake --graphviz选项,我得到一个复杂的二分图,其中包含从每个可执行文件 A、B 和 C 到每个库 X、Y 和 Z 的边。

我想知道是否有一种方法可以将所有库合并为一个。


所有这些都在一定程度上取决于您的平台、编译器和库的类型:

  1. 如果您可以自己构建 X、Y、Z:创建一个新项目XYZ,从 X、Y 和 Z 的聚合源文件构建。但我想如果这是可能的,你就不会问这样的问题了。

  2. 如果您无法重建库并且它们是作为共享库(dll/so)构建的,那么您就不走运了。您可以尝试编写一个包装器库,它隐藏 X、Y 和 Z 的所有内部结构,并将由应用程序 A、B 和 C 使用。

  3. 如果它们被构建为静态库,请看一下这个问题 https://stackoverflow.com/questions/665752/combining-static-libraries。因为静态库只不过是目标文件的存档,所以您可以从每个库中提取目标代码并将它们重新组合ar.

但你为什么要这么做呢?假设您有第四个应用程序 D,它仅依赖于 X。那么您无论如何都需要单独的库 Y(除非您希望不必要地链接所有库)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake - 将多个库合并为一个 的相关文章

随机推荐

  • 无法在所有计算机上访问 JAR 中的资源

    我正在编写一个应用程序 特别是 Bukkit Minecraft 服务器的插件 执行此操作需要我从应用程序的 JAR 访问 properties 文件 这是我遇到一个奇怪的问题的地方 当我在我的开发 PC 上测试该程序时 它运行得很好 pr
  • WebMatrix Database.Query 与自定义 CommandTimeout

    考虑以下带有 TestTable 和过程的 TestDb USE TestDb GO DROP TABLE dbo TestTable IF NOT EXISTS SELECT 1 FROM sys tables WHERE name Te
  • GAC 似乎包含两个具有相同名称、版本和公钥令牌的程序集

    我目前正在凝视这一页 http gacviewer cloudapp net Default aspx声称会列出典型 Azure VM 上的 GAC 内容 请注意 以下程序集和许多其他程序集列出了两次 AuditPolicyGPManage
  • 我如何在我的 Connect 4 java 代码中查看获胜者? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白如何在连四中找到获胜者 请告诉我我应该怎么想以及如何在连四中找到获胜者 我应该如何使用 for 循环来找到它们 我应该如何使用
  • BitTorrent 扩展协议

    我正在尝试用java编写自己的bittorrent客户端 这是一个make work项目来刷新我的java技能 我一直停留在开发的某个阶段 尽管有一些用于 BitTorrent 开发的论坛 但它们似乎并不十分活跃 到目前为止我可以执行以下操
  • Android ICS:JNI 错误尝试使用过时的本地引用 0x1

    将我的手机升级到 android 4 03 ics 后 我的游戏不再打开 它只是关闭 设备上没有任何错误消息 在 eclipse 上也有此消息 04 02 16 55 27 672 E dalvikvm 26884 JNI ERROR ap
  • VIM 在quickfix中搜索模式

    基本上我需要创建一个快速修复缓冲区 列出与正则表达式匹配的所有行 什么是最好的方法 全局命令可能不是最好的 但我认为它应该可用 全局命令的输出是完美的 但我需要它超级链接匹配的线 您也可以不使用全局命令并坚持使用内置命令 使用 vimgre
  • 在response.sendRedirect()中传递参数 - JSP

    我是网络技术新手 我正在尝试编写一个简单的程序 要求用户输入名称 如果有效 则页面重定向到另一个 jsp 文件 RedirectIfSuccessful jsp 如果无效则页面重定向到 RedirectIfFailed jsp 我正在使用r
  • 有没有办法访问 Skype IM 日志?

    我尝试查看 C Users name AppData Roaming Skype 发现一个名为 chatsync 的文件夹 其中有一些神秘的文件夹 其中的文件以 dat 结尾 我几乎可以肯定这些是聊天日志 但我不知道如何正确打开这些文件 记
  • 指定为定义者的 MySQL 用户不存在

    我正在尝试使用 php 调用存储过程 前一天这是有效的 但今天我收到一个错误 指定为定义者的用户 用户名 前一天的 ip 不存在 该程序位于主机中 我通过 cpanel 的远程 MySql 授予我的 IP 访问权限 我使用的代码是正确的 取
  • Haskell 中类型和数据类型有什么区别?

    我对 a 之间的区别有点困惑type and a 数据类型在哈斯克尔 从我遇到的文献中我得到的印象是它们是不同的概念 Type and 数据类型指的是完全相同的概念 Haskell 关键字type and data但有所不同 data允许您
  • 如何使用 Gson 反序列化带有可选字段的 json

    我使用 Gson 使用以下代码从给定 API 反序列化 JSON 字符串 Gson gson new Gson Map
  • Codeigniter URL 重写

    我正在使用以下内容htaccess脚本以便我可以隐藏index php来自 URI RewriteEngine on RewriteCond 1 index php resources assets robots txt RewriteCo
  • 如何使具有自定义布局的操作按钮的样式类似于 Android 3.0+ 中的标准操作按钮

    我在使用 honeycomb 操作栏中的自定义操作按钮时遇到了一些麻烦 我正在添加一个使用自定义布局的菜单项 使用 android actionLayout 属性 自定义布局的原因是我想要一个具有两行可以动态更新的文本的按钮 但是 我仍然希
  • 资源 -> 当前项目触发器已从 Apps 脚本代码编辑器中消失

    我使用 资源 gt 当前项目 触发器来控制某些项目的执行时间 例如 我的一些项目会每天早上 4 点左右更新电子表格 现在 当我单击 资源 时 当前项目触发器选项消失了 发生了什么 这个更改是在最后一天左右进行的 因为上次我在做一个项目时它就
  • 采用无服务器的 MoonMail Lambda 架构

    我一直在研究这个项目 因为让整个系统成为 Lambda 函数集合的想法似乎非常有吸引力 事实上 几年前我编写了一些软件 其功能与 MoonMail 几乎相同 并且由于某些规格发生了变化而需要更新 我正在评估将我的软件移植到 Lambda 或
  • concatMap 的作用是什么? [复制]

    这个问题在这里已经有答案了 什么是concatMap做 我知道什么concat and map做 是两者放在一起还是完全不同的功能 是的concatMap函数只是concat and map放在一起 由此得名 将函数放在一起只是意味着组合它
  • 如何使用 C99 标准类型在大多数平台上实现最大的可移植性和效率?

    首先 这是我对这个问题的理解和认为是正确的 对单个变量使用快速数据类型 例如计数器或for循环索引 例如 define LOOP COUNT 100U uint fast8 t index for index 0 index lt LOOP
  • 在 C# 中使用 SmtpClient 发送电子邮件时出现问题

    我有一个 ASP Net MVC 应用程序 我正在尝试发送 HTML 电子邮件 我通过读取带有标记的 HTML 文件 然后替换标记来完成此操作 这部分很好 生成的 HTML 正是我想要的 但是当我发送电子邮件时 我收到的内容看起来像
  • CMake - 将多个库合并为一个

    假设我有可执行文件 A B C 并且有外部库 X Y Z SET EXTERNAL LIB X Y Z TARGET LINK LIBRARIES A EXTERNAL LIB TARGET LINK LIBRARIES B EXTERNA