OSX:如何将静态库转换为动态库?

16

假设我在一台安装了Xcode 4.4的Mountain Lion Mac上有一个名为somelib.a的第三方库。 我想从中获取一个名为somelib.dylib的动态库。 适当的Linux命令是:

g++ -fpic -shared -Wl,-whole-archive somelib.a -Wl,-no-whole-archive -o somelib.so

将 -whole-archive 和 -no-whole-archive 参数传递给链接器。 在 Mac 上执行相同操作时:

g++ -fpic -shared -Wl,-whole-archive somelib.a -Wl,-no-whole-archive -o somelib.dylib

链接器出现错误:

ld: unknown option: -whole-archive

看起来,在OSX上的ld命令和GNU ld命令不同。我该如何修改上面的命令,以便获得所需的结果?

提前致谢!

3个回答

18

我找到了解决我的问题的方法:

g++ -fpic -shared -Wl,-force_load somelib.a -o somelib.dylib

需要的参数是 -force_load

  • 后面需要跟上你想确保加载的单个库。
  • 也就是说,每个库都需要重复使用这个参数(不像 -noall_load 方法,可以将它们包装在一起)。
  • 例如,-Wl,-force_load libYetAnotherFile.a(其中 -Wl, 部分只是因为我们没有直接传递参数给链接器而需要加上)。

请注意,旧版答案中使用的是 -noall_load,但现在会导致链接器错误(因为 -noall_load 已被删除,在此之前已经过时)。


如果将 -all_load 替换为 -force_load,似乎可以将一个 1.2mb 的 .a 文件压缩成一个 4kb 的 .dylib 文件,那么最有可能的诊断是什么? - Tommy
@Tommy,我刚看到你的评论。我猜它只提取您实际使用的符号,并且您仅使用该存档的一小部分。 - hanslovsky
得到错误 - ld: 找不到符号对于架构 x86_64 - Balasubramanian
1
现在-force_load是唯一的解决方案!因为-noall_load会导致一个很好的链接器错误(因为它已经被删除,之前已经过时了)。 - Top-Master
@Top-Master 这是在原始答案中进行简单的一对一替换吗?我很乐意更新我的答案,但我没有 Mac 进行测试。 - hanslovsky
1
唯一的区别是 -force_load 需要为每个库重复使用(例如 "-force_load libA.a -force_load -lB -force_load libC.a",其中 -lB 相当于 libB.a)。 - Top-Master

5
注意:OSX ld 链接器文档的链接。

http://www.unix.com/man-page/osx/1/ld/

我知道现在回答有点晚了,但是我没有足够的声誉来对@hanslovsky的回答进行评论。然而,对于我来说,拥有选项文档也很有帮助。它确切地说明了选项的作用,以及ld链接器还具有的其他选项。所以我只是想与其他遇到链接问题的人分享一下。
更新:
在@GhostCat的评论后,我决定扩展我的回答。 -all_load的文档如下:

-all_load

Loads all members of static archive libraries.
所以它会加载你注释的所有静态库。如果你想要类似于--whole-archive--no-whole-archive的东西,那么你需要使用-force_load-noall_load-force_load "path_to_archive"
加载指定静态存档库的所有成员。注意:- all_load强制加载所有存档的所有成员。此选项允许你针对特定的存档。 -noall_load 这是默认设置。此选项已过时。
然后,你可以使用-force_load定义要完全加载的库,然后稍后再使用-noall_load将其关闭。

2
感谢您的评论。我现在已经更深入地回答了。 - Martin Kristjansen
如果你修改了我的答案中的解决方案,使用你的答案中的标志并将其添加到你的答案中,我将接受你的答案作为正确答案。 - hanslovsky

3
根据ld手册,-noall_load是默认设置并被忽略。 (如果您使用它,将收到错误消息:ld:警告:选项-noall_load已过时且被忽略)
显然,仅将-all_load应用于一个库的方法如下:
-Wl,-force_load,somelib.a

我现在没有 Mac,但我稍后会尝试这个,谢谢。 - hanslovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接