我尝试使用最新的Xcode cmd行工具在OSX 10.10中编译一些代码。编译工作,但链接是一个噩梦。首先,我得到一个符号被多次定义的错误。此错误是正确的,但定义是相同的,并且在我无法控制的第三方库中。我无法弄清楚如何强制链接器忽略此问题。一个重要的注意事项是,相同的代码在我的Ubuntu盒子上,在clang和gcc下完美地编译,链接和运行。此链接器问题仅在OS X下。库是静态的。
我遇到的第二个问题甚至更奇怪。如果我删除一些(必要的)功能,以便我可以编译和链接程序,我运行它时得到以下有趣的消息:" dyld:找不到符号:__ ZNSt12future_errorD1Ev"。到底是怎么回事,我该怎么办呢?谷歌在这方面没有任何帮助。
答案 0 :(得分:3)
好的,所以我已经根据我的理解解决了这个问题。这是我学到的。首先,使用Apple的“特殊”版本的Clang,在OSX上似乎无法解决静态链接问题。如果没有编辑库的源代码,似乎没有办法告诉编译器忽略重复的符号定义。曾经有过这样的选项(例如-m),但它们都被弃用了一段时间。因此,为了解决这个问题,我必须使至少一个库动态化。
第二个问题是由于我尝试链接的其中一个库以某种方式针对libstdc ++进行编译。但是,Apple的clang希望默认情况下针对libc ++编译所有内容。因此,问题是两个库之间的兼容性问题--- std :: future_error在运行时和运行时都有不同的错位名称(当我使用libc ++时)无法找到libstdc ++中的符号。这个问题的正确解决方案(我咬了一口子并做了)是使用libc ++重新编译这个项目中的任何库,因为标准库的两个实现通常不兼容。
无论如何,我希望这最终对其他人有用。我发现Apple非常不同,以确保在Linux下的多个编译器下运行良好的构建,在他们的自定义版本的clang下在他们的操作系统中可怕地破坏,这令人非常沮丧。