在 XCode 上为 iOS 使用自定义构建的 OpenCV 会产生 ___sincos_stret 未定义符号

Posted

技术标签:

【中文标题】在 XCode 上为 iOS 使用自定义构建的 OpenCV 会产生 ___sincos_stret 未定义符号【英文标题】:Using custom built OpenCV for iOS on XCode produces ___sincos_stret undefined symbol 【发布时间】:2013-07-09 16:20:04 【问题描述】:

我正在尝试在我的 iPhone 应用程序中使用 C++ 静态库,该应用程序使用 ios 版 OpenCV 的修改版本,但我在链接时遇到了这个问题:

Undefined symbols for architecture armv7:
  "___sincos_stret", referenced from:
      cv::initInterTab2D(int, bool) in opencv2(imgwarp.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我真的不明白我错过了什么,OpenCV 中似乎没有该功能,我在网上找不到任何有意义的东西;我想知道它是否在某个数学库中,但我还没有找到任何东西。

我已经用 Clang 编译了 OpenCV,并使用了默认的 libc++ 库。

libmylibrary.a 和 OpenCV2 框架正确位于链接库列表中。

我是 XCode 的新手,因此在编译静态库和/或将其链接到我的项目中时,我可能会遗漏一些琐碎的事情。

我没有更改该对象的源代码,因为我的更改与 OpenCV 的 imgproc 模块的另一部分有关,因此我猜即使使用默认版本也可能发生这种情况。

你有什么线索吗?

【问题讨论】:

您是否安装了 XCode 开发预览版?您是如何构建 OpenCV 库的? 我使用的是 XCode 4.6.3,但我尝试了 XCode 5-DP3,在这两种情况下都没有成功,尽管后者在运行时会崩溃。我正在使用源代码中提供的 python 脚本构建 OpenCV 库,因为它写在 platform/ios 目录下的 readme.txt 中。 【参考方案1】:

为了解决 Xcode 5 工具链的这个问题,我指定了支持的最低 iOS 版本作为编译器选项,以匹配 Xcode 中的配置。例如:

-miphoneos-version-min=5.0

您可以将其添加到 makefile 中的 C 和 CXX 标志

CFLAGS += -miphoneos-version-min=5.0
CXXFLAGS += -miphoneos-version-min=5.0

【讨论】:

非IOS目标有这样的解决方案吗?【参考方案2】:

不想用低版本XCode编译的朋友,可以试试改OpenCV iOS的python编译脚本。在 build_framework.py 中,我在行中添加了IPHONEOS_DEPLOYMENT_TARGET=6.0 并为 iOS 重建了 OpenCV。

os.system("xcodebuild -parallelizeTargets ARCHS=%s -jobs 8 -sdk %s -configuration Release -target ALL_BUILD" % (arch, target.lower()))
os.system("xcodebuild ARCHS=%s -sdk %s -configuration Release -target install install" % (arch, target.lower()))

得到

os.system("xcodebuild IPHONEOS_DEPLOYMENT_TARGET=6.0 -parallelizeTargets ARCHS=%s -jobs 8 -sdk %s -configuration Release -target ALL_BUILD" % (arch, target.lower()))
os.system("xcodebuild IPHONEOS_DEPLOYMENT_TARGET=6.0 ARCHS=%s -sdk %s -configuration Release -target install install" % (arch, target.lower()))

对我来说解决了这个问题。符号__sincos_stret

TODO:虽然这解决了问题,但在从 python 脚本生成的 OpenCV.xcodeproj(在构建文件夹中)中,它的部署目标仍然是 iOS 7.0。可能有更清洁的方法。

【讨论】:

【参考方案3】:

我在安装 XCode 5 开发者预览版并使用 build_framework.py 脚本构建 OpenCV 后遇到了这个问题。 ___sincos_stret 似乎来自使用新的编译器版本。

我通过更改命令行工具的路径解决了这个问题。

在终端中,验证 XCode 命令行路径:

xcode-select --print-path

如果它在XCode5-DP.app 内打印路径,则切换到 Xcode 4 的工具:

xcode-select --switch /Applications/XCode.app/Contents/Developer

并重建框架。然后尝试重新编译项目。

【讨论】:

这解决了这个问题,你是完全正确的。总结:XCode 5-DP3 和使用相关工具编译 OpenCV 似乎存在问题。要修复它,您必须启动 Aurelius 的命令,然后使用 XCode 4 的工具从头开始重建 OpenCV、静态库和 iPhone 项目。我想知道为什么会出现这个问题,但我对修复,当然。【参考方案4】:

根据在其他地方支持亚当问题的快速搜索,该符号在[path to SDK]/usr/lib/system/libsystem_m.dylib 中定义。证明:

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

不要坚持使用旧版本的工具或 SDK,只需确保您链接到了旧版本。

【讨论】:

以上是关于在 XCode 上为 iOS 使用自定义构建的 OpenCV 会产生 ___sincos_stret 未定义符号的主要内容,如果未能解决你的问题,请参考以下文章

未在 iOS 10 上为基于 XCode 7.3 构建的应用程序生成设备令牌

在 iOS 上使用故事板显示自定义键盘构建

由于“链接器命令失败,退出代码为 1(使用 -v 查看调用)”,无法在 El Capitan 上为 Xcode 7 项目构建开发分支

如何在情节提要的非启动 ViewController 上为按钮的 TouchUpInside 事件添加自定义代码?

应用程序崩溃整个设备在Segue上为iOS 9 + Xcode 7

为 Kivy-ios 编译自定义模块