3

我正在尝试在我的 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

4 回答 4

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
于 2013-09-12T16:50:45.847 回答
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(在构建文件夹中)中,它的部署目标仍然是 iOS 7.0。可能有更清洁的方法。

于 2013-10-31T05:05:51.823 回答
1

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

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

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

xcode-select --print-path

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

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

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

于 2013-07-09T16:41:45.430 回答
0

根据在其他地方支持亚当问题的快速搜索,该符号在 中定义[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,只需确保您链接到它。

于 2013-09-26T00:21:53.410 回答