繁体   English   中英

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

[英]OSX: How do I convert a static library to a dynamic one?

假设我在安装了 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 失败并出现错误:

ld: unknown option: -whole-archive

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

先感谢您!

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

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

所需的参数是-force_load

  • 后面需要跟一个你想确保加载的库。
  • 我的意思是,需要为每个库重复它(与包装它们的-noall_load方法不同)。
  • 例如, -Wl,-force_load libYetAnotherFile.a (其中-Wl,-force_load libYetAnotherFile.a -Wl, part 只是必需的,因为我们不直接将参数传递给链接器)。

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

注意: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再次将其关闭。

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

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

-Wl,-force_load,somelib.a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM