【问题标题】:___sincos_stret undefined symbol when linking___sincos_stret 链接时未定义的符号
【发布时间】:2013-10-01 16:28:06
【问题描述】:

像之前提到的here___sincos_stret 在使用 Xcode5 命令行工具编译使用此符号的项目时无法找到。

在上面引用的线程中,针对 IOS 目标发布了解决方案(将 -miphoneos-version-min=5.0 传递给编译器),是否有针对桌面 (x64) 目标的解决方案?

例如,当我尝试编译 polycode 时会发生这种情况。

编辑 2:

奇怪的是,在手动编译了上一个错误中引用的库之后,错误现在恰好位于lto.o,它本身就是一个内部的llvm头......

undef: ___sincos_stret
Undefined symbols for architecture x86_64:
  "___sincos_stret", referenced from:
      _mdct_init in lto.o
      _dradfg in lto.o

我正在使用 Xcode 5 运行 OSX 10.9 DP。This is the link step

【问题讨论】:

  • 请写一个独立的问题,不要参考另一个线程。
  • @LaszloPapp 这似乎是 Xcode5 的一个普遍问题,除了将另一个线程的答案复制粘贴到其中之外,我不知道如何让这个问题更加独立。
  • 然后请复制粘贴,但只复制严格相关的部分。
  • 当您说“使用 Xcode 5 命令行工具”时,您是指 gcc/etc 还是 xcodebuild?
  • @Tommy clang,制作等

标签: c++ xcode macos xcode5


【解决方案1】:

stret 是 Apple 所说的“返回结构”。 ___sincos_stret 是一种 LLVM 优化——如果您编写的代码调用 sin(n)cos(n) 并使用这两个结果,那么编译器将调用返回结构的 sincos 方法,接收一个包含这两个东西的结构。如果操作数相同,一次计算比单独计算要快。

在肤浅的浏览中,我在initInterTab2D 中看不到sincos,但我预计有些内容正在内联。

一边摸索一边尝试:

cd /Applications/Xcode.app/Contents/Developer/Platforms 
grep -lr ___sincos_stret *

通过它并在可能的结果上使用nm,我发现___sincos_stret 函数在iOS 7.0 和OS X 10.9 中作为libsystem_m.dylibs 的一部分公开。例如。如果您的 Xcode 安装在默认位置,请尝试:

nm /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib/system/libsystem_m.dylib | grep sincos

和/或:

nm /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib/system/libsystem_m.dylib | grep sincos

您会在其中任何一个中看到该符号。所以正确的解决方案是在 Xcode 中设置一个较旧的部署目标,或者在您的 makefile 中执行等效操作。

【讨论】:

  • 我很确定我是为 OSX 构建的。我使用项目中的 cmake 文件并使用 make 编译项目。我将在问题中添加一个错误。
  • __sincos_stret 符号由/usr/lib/system/libsystem_m.dylib 在 OS X 上提供,就像 iOS 一样。提问者的问题是编译器在一个或多个目标文件中生成符号,因为在编译步骤中没有指定目标操作系统版本(因此它默认为主机系统版本),但链接步骤指定操作系统版本
  • @StephenCanon 10.9 是目前处于保密协议下的测试版,对吧?所以我没有找到符号,因为我没有 beta SDK,但是它已经被编译器替换了,因为很多其他人都有?
  • 编译器不应该生成它,除非它在拥有它的系统上运行并且 macosx-version-min 设置为拥有它(或未指定)的系统。
  • @Adam S - 从一个完全不同的角度偶然发现:试图让 matplotlib 在 Python 中工作。部分证实了斯蒂芬·佳能的评估。当它试图获取一些矩阵变换代码时,它在加载(名为“update_path_extents”的包)期间爆炸,寻找未解析的参考。到 /usr/lib/libSystem.B.dylib 中的“___sincos_stret”。对我来说可悲的是“这条路已经变冷了”,我不知道如何解决它:-(
【解决方案2】:

在文本编辑器中打开以下文件 /opt/local/etc/macports/macports.conf 并在那里添加一行

# MACOSX_DEPLOYMENT_TARGET - osx version to be compatible with earlier OSX version.
macosx_deployment_target            10.8
MACOSX_DEPLOYMENT_TARGET            10.8

【讨论】:

    【解决方案3】:

    似乎卸载并重新安装 Xcode5 DP 和 OSX 10.9 命令行工具解决了这个问题。我想从以前的版本更新有问题。

    【讨论】:

    • @trojanfoe 因为这是解决问题的方法。
    • 拜托,您能否详细说明一下您是如何“卸载”Xcode 和 CL 工具的?您是否只是删除了 Xcode 并重新安装了它,还是必须执行其他任何操作?
    • 它也适用于我,只需从 Apple 开发中心安装 Xcode 5.1DP,然后运行“xcode-select -s /Applications/Xcode51-DP.app/Contents/Developer/”如果您想将配置恢复为原始配置,只需运行“xcode-select --reset”即可。
    • 是的,这对我也有用(小牛队用户)。我只是在 App Store 中搜索了 XCode 并安装了它。虽然 App Store 似乎出了点问题,因为它没有显示任何下载或安装的进度信息,但最终,它神奇地完成了。
    【解决方案4】:

    您想要-mmacosx-version-min=10.8(或任何您的目标操作系统版本)。

    【讨论】:

    • 这似乎有道理,但即使我在每个 cmake 命令中将参数添加到 CXXFLAGS ,错误仍然存​​在。不过,我可能做错了什么 - this is my current make procedure for this case(目前无法与其他项目一起测试)。
    • 您是否尝试过使用基于curses的界面ccmake
    • 刚刚在使用旧版 OS X SDK 链接到 ICU 的项目时遇到了这个问题。有效的方法是在CPPFLAGS LDFLAGS 中设置-isysroot-mmacosx-version-min 来构建ICU。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2022-01-04
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多