我已经将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,他们肯定在那里!
答案 0 :(得分:2)
我认为这与在共享库边界中抛出异常有关。这个page说:
应用程序应该使用多种情况 共享libgcc而不是静态版本。其中最常见的 当应用程序希望抛出并捕获异常时 不同的共享库。在那种情况下,每个库都为 以及应用程序本身应该使用共享的libgcc。
因此,G ++和GCJ驱动程序会自动添加-shared-libgcc 无论何时构建共享库或主可执行文件,因为C ++ 和Java程序通常使用异常,所以这是正确的 要做。
其余部分提供了一种可能的解决方法(显示),即使用GCC驱动程序链接您的共享库,但是如果静态链接库抛出异常,您可能得到分段违规。