2012-03-29 149 views
2

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

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

回答

2

我相信这是在跨共享库边界抛出异常。这page说:

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

因此,G ++和GCJ司机只要构建一个共享库或主可执行文件,因为C++ 和Java程序通常使用的例外自动添加-shared-libgcc的 ,所以这是正确的事情 做。

该段的其余部分提供了一个可能的解决方法(看来),并且是使用GCC驱动程序共享库链接,但如果静态链接库抛出异常,你会可能得到分割违规。

+0

谢谢。 Apple文档似乎主要是指C++。到目前为止,我测试过的所有东西都是笔直的。它还说如果您使用的是非GNU链接器,则共享libgcc默认链接。这就是我所看到的。这看起来像一个链接器问题,但在查看GCC的-v输出时,它在编译可执行文件时向LD传递静态标志,并且工作正常。也许LD在编译共享库时会忽略-static标志。 – Synthetix 2012-03-29 15:19:59

+0

我只是试图编译我自己的dylib作为测试,它工作(libgcc被静态链接),所以我知道这是可能的。 – Synthetix 2012-03-29 16:10:30

相关问题