【问题标题】:Linking issues with OS X 10.10与 OS X 10.10 的链接问题
【发布时间】:2015-01-05 11:59:48
【问题描述】:

我正在尝试使用最新的 Xcode 命令行工具在 OSX 10.10 中编译一些代码。编译工作,但链接是一场噩梦。首先,我得到一个符号是多重定义的错误。这个错误是正确的,但定义是相同的,并且在我无法控制的第 3 方库中。我不知道如何强制链接器忽略这个问题。一个重要的注意事项是,相同的代码可以在我的 Ubuntu 机器上完美地编译、链接和运行,无论是在 clang 还是 gcc 下。此链接器问题仅在 OS X 下。库是静态的。

我遇到的第二个问题更奇怪。如果我删除一些(必要的)功能只是为了编译和链接程序,我会在运行它时收到以下有趣的消息:“dyld: Symbol not found: __ZNSt12future_errorD1Ev”。就是这样,我该如何解决?谷歌在这方面没有帮助。

【问题讨论】:

    标签: c++ operating-system xcode5 clang linker-errors


    【解决方案1】:

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

    第二个问题是由于我试图链接的其中一个库不知何故是针对 libstdc++ 编译的。但是,Apple 的 clang 想要默认编译所有针对 libc++ 的东西。因此,问题是两个库之间的兼容性之一 --- std::future_error 在两者和运行时(当我使用 libc++ 时)都有不同的重整名称,无法找到来自 libstdc++ 的符号。这个问题的正确解决方案(我硬着头皮做了)是使用 libc++ 重新编译这个项目中的任何库,因为标准库的两个实现通常不兼容。

    无论如何,我希望这最终对其他人有用。我感到非常沮丧的是,Apple 必须足够不同以确保构建在 Linux 下的多个编译器下完美运行,在他们的操作系统中在其自定义版本的 clang 下严重崩溃。

    【讨论】:

    • 最后 - 解决了我与 c++ 库链接的问题。我升级到 Yosemite,重建 fink,发现我的旧代码不再以相同的方式链接“架构 x86_64 的未定义符号:”。顺便说一句,OSX 的 ld 中似乎也不再存在暴力破解 --start-group/--end-group 了。
    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多