链接问题与OS X 10.10

问题描述:

我想使用最新的Xcode cmd线工具在OSX 10.10中编译一些代码。编译工作,但链接是一场噩梦。首先,我得到一个符号被多次定义的错误。这个错误是正确的,但定义是相同的,并且在我不能控制的第三方库中。我无法弄清楚如何强制链接器忽略这个问题。一个重要的注意事项是,相同的代码在我的Ubuntu机器上编译,链接和运行完美,在clang和gcc下。此链接器问题仅在OS X下。库是静态的。链接问题与OS X 10.10

我遇到的第二个问题更加陌生。如果我为了编译和链接程序而删除一些(必要的)功能,当我运行它时,我会得到以下有趣的消息:“dyld:Symbol not found:__ZNSt12future_errorD1Ev”。该死的是,我该如何解决它? Google在这方面毫无帮助。

好的,所以我已经解决了这个问题,尽我所能了解。这是我学到的东西。首先,使用Apple的“特殊”版本的Clang在OSX上解决静态链接问题似乎不太可能。在编辑库的源代码时,似乎没有办法告诉编译器忽略重复的符号定义。曾经有这样的选项(例如-m),但它们都被弃用了一段时间。因此,为了解决这个问题,我必须至少让其中一个库变得动态。

第二个问题是由于我试图链接的一个库在某种程度上是针对libstdC++编译的。然而,苹果的叮当声想要默认情况下对libC++进行编译。因此,问题在于两个库之间的兼容性--- std :: future_error在两者和运行时(当我使用libC++时)都有不同的错误名称,因此找不到libstdC++中的符号。这个问题的正确解决方案(我咬紧牙关并做了)是使用libC++重新编译这个项目中的任何库,因为标准库的两个实现通常不兼容。

无论如何,我希望这最终对其他人有用。我发现令人难以置信的是,苹果必须有足够的差异来确保在Linux下的多个编译器下完美工作的构建,在他们的定制版本的铿锵声下,在他们的操作系统中发生可怕的破坏。

+0

最后 - 解决我的问题链接到C++库。我升级到优胜美地,重建fink,发现我的旧代码不再以相同的方式链接“架构x86_64的未定义符号:”。顺便说一句,看起来OSX的ld中不再有蛮力 - 开始组/终端组。 – 2015-07-23 17:27:15