假设我在运行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不同。我如何修改上述命令以便获得所需的结果?
提前谢谢!
答案 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
链接器也具有的其他选项。
所以我只想与发现链接问题的其他人分享。
@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