【问题标题】:OSX: How do I convert a static library to a dynamic one?OSX:如何将静态库转换为动态库?
【发布时间】:2013-04-11 12:56:45
【问题描述】:

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

提前谢谢你!

【问题讨论】:

    标签: macos dynamic linker static-libraries


    【解决方案1】:

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

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

    需要的参数是-force_load:

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

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

    【讨论】:

    • 如果用或不用-force_load 代替-all_load 显然将1.2mb .a 压缩成4kb .dylib,最可能的诊断是什么?
    • @Tommy 我现在才看到你的评论。我猜它只会提取您实际使用的符号,并且您只使用该存档的一小部分。
    • 出现错误 - ld: symbol(s) not found for architecture x86_64
    • 现在-force_load 是唯一的解决方案!!因为-noall_load 导致了一个不错的链接器错误(因为它已被删除,之前已过时)。
    • @Top-Master 是原始答案中简单的一对一替换吗?我很乐意更新我的答案,但我没有要测试的 mac。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的评论。我现在已经给出了更深入的答案。
    • 如果您修改我的答案中的解决方案以使用您答案中的标志并将其添加到您的答案中,我将接受您的答案作为正确答案。
    【解决方案3】:

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

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

    -Wl,-force_load,somelib.a
    

    【讨论】:

    • 我现在没有Mac,但我稍后会尝试,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 2011-01-24
    • 2011-05-26
    • 2010-10-13
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多