18

我正在尝试创建一个包含目标文件和现有静态库的单个静态库,这些静态库都已在构建过程的早期编译。有没有一种简单的方法可以使用“ar”来做到这一点,还是我需要解压(ar x library_name)每个库并将其目标文件添加到我的统一库中?

4

3 回答 3

9

如果你想创建一个共享库,你可以使用这个:

您可以使用ld的--whole-archive标志:

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

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

对于静态库,您可能必须先提取对象。

我为ar找到了以下内容

gnu ar 可以选择创建一个精简存档,其中包含一个符号索引和对存档成员文件的原始副本的引用。这样的存档对于构建在本地构建中使用的库很有用,其中可重定位的对象预计将保持可用,并且复制每个对象的内容只会浪费时间和空间。精简存档也被展平,因此将一个或多个存档添加到精简存档将单独添加嵌套存档的元素。档案元素的路径是相对于档案本身存储的。

也许你可以使用这样一个精简的存档

于 2009-06-04T22:53:40.930 回答
1

归档档案始终是可能的。当从实现中调用实际 API 时,我没有测试它是否有效。

例如:ar rc lib1.a obj1.o ar rc lib2.a obj2.o ar rc lib3.a lib1.a lib2.a

 you can check the contents of lib3.a by trying out.

   ar x lib3.a which would extract lib1.a and lib2.a

但是您需要构建从 obj1.o 和 obj2.o 调用 API。这样就无需从各个档案中提取目标文件。

希望能帮助到你!

于 2011-09-23T12:45:39.740 回答
0

您将需要从其他库中提取目标文件并将提取的目标文件捆绑到您的复合库中。

还要考虑增量加载:ld -r

于 2009-06-04T21:07:01.410 回答