将问题与OS X 10.10联系起来

nom*_*mad 5 c++ operating-system clang linker-errors xcode5

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

我遇到的第二个问题甚至更奇怪.如果我删除一些(必要的)功能只是为了我可以编译和链接程序,我运行它时得到以下有趣的消息:"dyld:未找到符号:__ ZNSt12future_errorD1Ev".到底是怎么回事,我该怎么办呢?谷歌在这方面没有任何帮助.

nom*_*mad 3

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

第二个问题是由于我尝试链接的库之一是以某种方式针对 libstdc++ 进行编译的。然而,Apple 的 clang 希望默认情况下针对 libc++ 编译所有内容。因此,问题是两个库之间的兼容性之一 --- std::future_error 在两个库中都有不同的损坏名称,并且在运行时(当我使用 libc++ 时)无法找到 libstdc++ 中的符号。这个问题的正确解决方案(我硬着头皮做了)是使用 libc++ 重新编译该项目中的任何库,因为标准库的两种实现通常不兼容。

无论如何,我希望这最终对其他人有用。我发现令人难以置信的是,Apple 必须有足够的不同才能确保构建在 Linux 下的多个编译器下完美运行,但在其自定义版本的 clang 下的操作系统中却严重崩溃。