【问题标题】:Can't get GCC's -static-libgcc working with DYLIB libraries on Mac OS X无法让 GCC 的 -static-libgcc 在 Mac OS X 上与 DYLIB 库一起使用
【发布时间】:2012-03-29 11:41:16
【问题描述】:

我已将 GCC 4.6.3 安装到 Mac 系统上的非系统路径中,它工作正常。但是,GCC 想要对我编译的所有二进制文件使用来自 libgcc 的代码,并且运行 otool -L 显示这些编译的程序在 GCC 的安装路径中查找 libgcc_s.1.dylib。我可以通过传递 -static-libgcc 来覆盖它,它只是将所需的东西编译到二进制文件中,这很好。问题是这似乎只适用于可执行文件,而不适用于共享库。如果我使用 GCC 编译一些我想在我的程序之一中作为 .dylib 使用的第三方库,即使我指定 -static,这些库仍会在本地 GCC 安装路径中查找 libgcc_s.1.dylib -libgcc! 不用说,这是一个问题,因为无法保证这些库在其他系统上运行时会找到 libgcc。

我用 ffmpeg 试过这个。如果我查看 config.log,肯定会使用 -static-libgcc。 GCC 只是没有将 libgcc 与生成的 dylib 静态链接。我什至尝试了 -nostdlib、-nostartfiles 和 -nodefaultlibs 选项,但它们被忽略了。再次,我检查了 config.log,它们肯定在那里!

【问题讨论】:

    标签: macos gcc compiler-construction ffmpeg shared-libraries


    【解决方案1】:

    我相信这与跨共享库边界抛出异常有关。这个page 说:

    在几种情况下,应用程序应该使用 共享 libgcc 而不是静态版本。其中最常见的 是当应用程序希望抛出和捕获异常时 不同的共享库。在这种情况下,每个库作为 以及应用程序本身应该使用共享的 libgcc。

    因此,G++ 和 GCJ 驱动程序会自动添加 -shared-libgcc 每当您构建共享库或主可执行文件时,因为 C++ Java 程序通常使用异常,所以这是正确的 去做。

    其余部分提供了一种可能的解决方法(它出现了),即使用 GCC 驱动程序链接您的共享库,但是如果静态链接的库引发异常,您可能获得分段违规。

    【讨论】:

    • 谢谢。 Apple 文档似乎主要指的是 C++。到目前为止,我测试的所有内容都是直接的 C。它还表示,如果您使用的是非 GNU 链接器,则默认链接共享 libgcc。这就是我所看到的。这似乎是一个链接器问题,但是当查看 GCC 的 -v 输出时,它确实在编译可执行文件时将 -static 标志传递给了 LD,并且工作正常。也许 LD 在被告知编译共享库时忽略了 -static 标志。
    • 我只是尝试编译我自己的 dylib 作为测试并且它有效(libgcc 是静态链接的),所以我知道这是可能的。
    猜你喜欢
    • 2013-09-06
    • 2012-07-10
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2012-08-17
    • 2015-11-05
    • 2011-06-08
    相关资源
    最近更新 更多