在XCode上使用自定义构建的OpenCV for iOS生成___sincos_stret未定义符号

时间:2013-07-09 16:20:05

标签: ios xcode opencv static clang

我正在尝试在我的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模块的另一部分有关,因此我想即使使用默认版本也可能发生这种情况。

你有线索吗?

4 个答案:

答案 0 :(得分:4)

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

-miphoneos-version-min=5.0

您可以将其添加到makefile

中的C和CXX标志
CFLAGS += -miphoneos-version-min=5.0
CXXFLAGS += -miphoneos-version-min=5.0

答案 1 :(得分:3)

对于那些不想使用较低版本的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(在build文件夹中)中,它仍然具有iOS 7.0的部署目标。可能会有一种更清洁的方式。

答案 2 :(得分:1)

在安装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

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

答案 3 :(得分:0)

在其他地方快速搜索支持Adam的问题时,符号在[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,只需确保您与之相关联。