我正在尝试创建一个包含目标文件和现有静态库的静态库,这些库都是在构建过程中先前编译过的。有没有一种简单的方法可以使用“ar”来执行此操作,还是需要解压缩(ar x library_name)每个库并将其目标文件添加到统一库中?
答案 0 :(得分:7)
如果要创建共享库,可以使用:
您可以使用ld中的 - 整个存档标记:
- 全归档
对于--whole-archive选项后命令行中提到的每个归档,请在链接中包含归档中的每个目标文件,而不是在归档中搜索所需的目标文件。这通常用于将存档文件转换为共享库,从而强制将每个对象包含在生成的共享库中。此选项可能不止一次使用。从gcc使用此选项时的两个注意事项:首先,gcc不知道此选项,因此您必须使用-Wl,-whole-archive。其次,不要忘记在归档列表之后使用-Wl,-no-whole-archive,因为gcc会将自己的归档列表添加到您的链接中,您可能也不希望这个标志也影响这些归档。
对于静态库,您可能必须先提取对象。
我为ar
找到了以下内容gnu ar可以选择创建一个瘦存档,其中包含符号索引和对存档成员文件的原始副本的引用。这样的存档对于构建在本地构建中使用的库是有用的,其中可重定位对象应该保持可用,并且复制每个对象的内容只会浪费时间和空间。精简归档也是扁平化的,因此将一个或多个归档添加到精简归档将单独添加嵌套归档的元素。存档元素的路径相对于存档本身存储。
也许你可以使用这样的瘦存档。
答案 1 :(得分:1)
始终可以存档档案。当从实现中调用实际的API时,我没有测试它是否有效。
Ex: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。然后,无需从单个档案中提取目标文件。
希望它有所帮助!
答案 2 :(得分:0)
您需要从其他库中提取目标文件,并将提取的目标文件捆绑到您的复合库中。
还要考虑增量加载:ld -r