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

时间:2013-04-18 12:04:43

标签: macos dynamic linker static-libraries

假设我在运行Mountain Lion且安装了Xcode 4.4的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失败并显示错误:

ld: unknown option: -whole-archive

似乎OSX上的ld与GNU ld不同。我如何修改上述命令以便获得所需的结果?

提前谢谢!

3 个答案:

答案 0 :(得分:14)

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

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

必需的参数是-all_load和-noall_load。

答案 1 :(得分:3)

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

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

我知道为此给出答案已经很晚了,但我没有足够的声誉对@hanslovsky回答发表评论。 但是,拥有选项的文档对我帮助很大。 它有助于完成选项,以及ld链接器也具有的其他选项。 所以我只想与发现链接问题的其他人分享。

UPDATE:

@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 :(得分:2)

根据ld手册,-noall_load是默认值,会被忽略。 (如果您使用它,则会收到错误消息:ld: warning: option -noall_load is obsolete and being ignored

显然,-all_load仅适用于一个库的方法如下:

-Wl,-force_load,somelib.a