我已将 GCC 4.6.3 安装到 Mac 系统上的非系统路径中,并且运行良好。但是,GCC 希望对我编译的所有二进制文件使用 libgcc 中的代码,并且运行 otool -L 显示这些编译的程序在 GCC 的安装路径中查找 libgcc_s.1.dylib。我可以通过传递 -static-libgcc 来覆盖它,它只是将所需的内容编译到二进制文件中,这很好。问题是这似乎只适用于可执行文件,而不适用于共享库。如果我使用 GCC 编译一些第三方库,我想在我的程序之一中使用 .dylib,这些库仍然会在本地 GCC 安装路径中查找 libgcc_s.1.dylib 即使我指定 -static-libgcc ! 不用说,这是一个问题,因为不能保证这些库在其他系统上运行时会找到 libgcc。
我用 ffmpeg 尝试过这个。如果我查看 config.log,肯定会使用 -static-libgcc。 GCC 只是没有将 libgcc 与生成的 dylib 静态链接。我什至尝试了 -nostdlib、-nostartfiles 和 -nodefaultlibs 选项,但它们被忽略了。我再次检查了 config.log,它们肯定在那里!
我相信这与跨共享库边界抛出异常有关。 这个页面说:
有几种情况应用程序应该使用 共享 libgcc 而不是静态版本。其中最常见的是 是当应用程序希望抛出和捕获异常时 不同的共享库。在这种情况下,每个库都作为 应用程序本身应该使用共享 libgcc。
因此,G++ 和 GCJ 驱动程序会自动添加 -shared-libgcc 每当您构建共享库或主可执行文件时,因为 C++ Java 程序通常使用异常,所以这是正确的事情 要做的事。
该部分的其余部分提供了一个可能的解决方法(看起来),即使用 GCC 驱动程序链接您的共享库,但是如果静态链接库抛出异常,您将可能遇到分段违规。