在动态库中包含静态库

2024-01-13

我有以下问题:

  • 几个目标文件 a1.o、a2.o、a3.o、...
  • 存档 libxxxx.a。 存档 libxxxx.a 仅包含目标文件:b1.o、b2.o 等...

我想从所有目标文件创建一个共享库(.so)。

问题:如果我使用:

g++ -shared libxxxx.a a1.o a2.o ... -o libnew.so

g++ 确实理解我想要链接静态库 libxxxx.a 并且不包含存档的所有符号。

一个简单的解决方法是首先使用以下命令扩展存档ar -x然后创建库,但它并不真正“优雅”。

必须有一个简单的命令来强制 g++ 将整个存档包含在 .so 中,但我找不到它。

感谢您的帮助。


From man ld:

--整个存档
对于 --whole-archive 选项后命令行中提到的每个存档,将存档中的每个目标文件包含在 链接,而不是在档案中搜索所需的目标文件。这通常用于将存档文件转换为共享文件 库,强制每个对象都包含在生成的共享库中。该选项可以多次使用。

在 gcc 中使用此选项时有两个注意事项:首先,gcc 不知道此选项,因此您必须使用 -Wl,-whole-archive。 其次,不要忘记在档案列表后使用 -Wl,-no-whole-archive,因为 gcc 会将其自己的档案列表添加到您的档案列表中。 链接,您可能不希望此标志也影响这些。

Example:

g++ -shared -o yourlib a.o. b.o. c.o -Wl,-whole-archive libstatic.a -Wl,-no-whole-archive

另请注意,在您的示例中,您首先放置静态库,然后放置目标文件 - 在这种情况下,除非您使用,否则将找不到目标文件中使用的符号和静态库中定义的符号--whole-archive链接器选项。如果您只想包含静态库中所需的符号,则需要将其放入after目标文件。

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

在动态库中包含静态库 的相关文章

  • 为什么GCC编译的应用程序总是包含_mcount符号?

    库并不总是包含 mcount 符号 但应用程序包含 您可以使用 gobjdump 或 nm 实用程序验证这一点 我读过 mcount 用于实现分析 但即使禁用分析并启用优化 O2 该符号仍然存在 它还有其他额外的用途吗 更新 我使用的是 S
  • 使用 `-ftrivial-auto-var-init` 保证非静态聚合对象的填充字节初始化为零

    我正在跟进C 标准是否保证非静态聚合对象的填充字节初始化为零 https stackoverflow com questions 70979077 does c standard guarantee the initialization o
  • 在非指针变量和类成员上放置 new

    考虑以下示例 include
  • 为什么对于整数键,“Map”操作比 JavaScript (v8) 中的“Object”慢得多?

    我很高兴使用Map对于在我的 JavaScript 代码库中随处访问的索引 但我刚刚偶然发现了这个基准 https stackoverflow com a 54385459 365104 https stackoverflow com a
  • 使用变量“name”不适用于 JS 对象

    该行为可以在这个小片段中看到 将其作为全局脚本执行 var name name FirstName Tom alert name FirstName 警报产生undefined在 Chrome 中 但在 IE 和 Firefox 中工作 当
  • empty() 在对象的非空属性上返回 TRUE

    我遇到了一个非常奇怪且意想不到的问题 empty 正在返回TRUE由于我不知道的原因 在一处非空的房产上 class MyObject private property public function construct property
  • 找出对象列表中是否包含具有指定字段值的内容?

    我有一个从数据库收到的 DTO 列表 它们有一个 ID 我想确保我的列表包含具有指定 ID 的对象 显然 在这种情况下创建具有预期字段的对象不会有帮助 因为 contains 调用 Object equals 并且它们不会相等 我想出了这样
  • Google Apps 脚本自动生成的库文档

    我目前正在开发一个 Google Apps 脚本库 它基本上将电子表格视为数据库对象 目前 该库有两个相同的功能 例如 Opens and creates a query object for a spreadsheet with the
  • 在 Groovy 中分配对象属性的简写方法?

    我使用此约定创建 Groovy 对象 Item item1 new Item name foo weight 150 是否有操作属性对象的速记约定 像这样的东西 item1 name hello weight 175 this does n
  • 字符串常量之前应有非限定 ID

    我目前正在编写一个 C 应用程序 它与 math h 结合实现了振荡器 我拥有的代码应该可以很好地用于该应用程序 尝试编译目标文件 但是我遇到编译器错误 很可能与语法 等有关 我认为这与命名空间有关 错误 终端输出 User Name Ma
  • 静态库和共享库的区别?

    静态库和共享库有什么区别 我使用 Eclipse 有多种项目类型 包括静态库和共享库 一个比另一个有优势吗 共享库是 so 或在 Windows 中为 dll 或在 OS X 中为 dylib 文件 与该库相关的所有代码都在此文件中 并由在
  • 模板化递归数据类型

    我有一个像这样的递归数据类型 template
  • 从 Python 调试 C 库 (ctypes)

    我有一个使用 ctypes 和 C 共享库 dll 文件 的 Python 程序 作为 IDE 我使用 Eclipse 其中将开发两个项目 C 共享库和使用它的 python 程序 我的想法是 当我在调试模式下启动Python程序时 我可以
  • G++ 错误:“”的类型不完整

    我被迫使用第三方加密狗访问库 该库提供包含文件 sense4 h 其代码如下 if defined WINDOWS define WINAPI define CONST const typedef unsigned char UCHAR t
  • 关于访问说明符

    我定义了一个类基 class Base private int i Base int i this i i 所以基类的对象可以访问私有变量 class BaseDemo public static void main String args
  • 如何在 PHP 中对数组和数据进行排序?

    这个问题旨在作为有关 PHP 中数组排序问题的参考 人们很容易认为您的特定案例是独特的并且值得提出新问题 但大多数实际上只是此页面上的解决方案之一的微小变化 如果您的问题因与此问题重复而被关闭 请仅在您能解释为什么它与以下所有问题显着不同的
  • 如果函数在类范围内声明,则 constexpr 不起作用[重复]

    这个问题在这里已经有答案了 我使用的是 g 4 8 0 它不包含早期版本constexpr漏洞 因此下面的代码有效fine http ideone com YkmUDJ constexpr int size return 5 int arr
  • 创建动态多维对象/数组

    我正在尝试使用 JS 创建一个多维数组 以便我可以通过 Ajax 调用 PHP 来发布一些数据 这可能很简单 但我对 JS 的了解很少关于这个具体的事情 这是带有代码的 JSFiddle http jsfiddle net k5Q3p 我想
  • TFS 2010 跨团队项目分支 - 最佳实践

    我在了解如何根据 TFS Ranger 团队提供的最佳实践配置 TFS 时遇到问题 问题是这样的 我的公司有多种产品使用共享的通用代码库 gt Core gt gt Main Source Parent Branch gt gt Produ
  • 如何转储所有 NVCC 预处理器定义?

    我想达到同样的效果 gcc dM E lt dev null 如所描述的here https stackoverflow com q 2224334 1593077 但对于 nvcc 也就是说 我想转储所有 nvcc 的预处理器定义 唉 n

随机推荐