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

han*_*sky 12 macos linker dynamic static-libraries

假设我在安装了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
Run Code Online (Sandbox Code Playgroud)

其中-whole-archive和-no-whole-archive传递给链接器.当我做相当于Mac的时候:

g++ -fpic -shared -Wl,-whole-archive somelib.a -Wl,-no-whole-archive -o somelib.dylib
Run Code Online (Sandbox Code Playgroud)

ld失败并出现错误:

ld: unknown option: -whole-archive
Run Code Online (Sandbox Code Playgroud)

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

先感谢您!

han*_*sky 14

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

g++ -fpic -shared -Wl,-all_load somelib.a -Wl,-noall_load -o somelib.dylib
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*sen 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.
Run Code Online (Sandbox Code Playgroud)

因此它会加载您注意到的所有静态库。如果您想要类似于--whole-archiveand的东西--no-whole-archive,那么您需要使用-force_loadand -noall_load

-force_load “存档路径”

加载指定静态归档库的所有成员。注意: - all_load 强制加载所有存档的所有成员。
此选项允许您定位特定的存档。

-noall_load

这是默认设置。此选项已过时。

然后您可以定义要完全加载哪些库-force_load,然后使用 再次将其关闭-noall_load

  • 感谢您的评论。我现在已经给出了更深入的答案。 (2认同)