14

假设我在运行 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 不同。我该如何修改上面的命令才能得到想要的结果?

先感谢您!

4

3 回答 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已被删除,之前已过时)。

于 2013-04-26T10:28:52.450 回答
4

注意: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-archiveand的东西--no-whole-archive,那么你需要使用-force_loadand -noall_load

-force_load "path_to_archive"

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

-noall_load

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

然后,您可以定义要完全加载的库,-force_load然后再使用-noall_load.

于 2017-07-05T07:56:07.427 回答
3

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

显然-all_load,申请一个图书馆的方法如下:

-Wl,-force_load,somelib.a
于 2015-05-06T05:47:58.457 回答