升级Xcode到4.5.2和OpenCV到2.4.3后出现链接错误

5

直到今天早上我的项目还是能够正常工作的。我使用的是xcode 4.3和一个较老的OpenCV版本(不确定具体版本)。OSX已经是10.7.x,但不是10.7.5

今天,升级了OSX到10.7.5,xcode到4.5.2,并下载了OpenCV 2.4.3后,在尝试构建项目时出现了以下链接器错误:

未定义符号,对于armv7架构:
"_OBJC_CLASS_$_ALAssetsLibrary",引自:
opencv2(cap_ios_video_camera.o)中的对象类引用
"cv::FeatureDetector::create(std::string const&)",引自:
ImageAnalyzer.o中的-[ImageAnalyzer detectBlobs:]
"cv::FeatureDetector::detect(cv::Mat const&, std::vector >&, cv::Mat const&) const",引自:
ImageAnalyzer.o中的-[ImageAnalyzer detectBlobs:]
ld:找不到符号(来自armv7架构)
clang:链接器命令失败退出码1(使用-v查看调用)

为了使用新的OpenCV框架,我删除了对旧框架的引用,并将项目引用更新为从这里下载的官方预构建opencv2.framework。
我还删除了对libz.dylib的引用,并添加了对libc++.dylib的引用。
最后一步是将前缀文件更新为新框架。现在前缀文件中相关部分如下:

#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif

这些问题都归结为4个链接错误,我似乎无法摆脱它们。我尝试使用libstdc++.dylib,但是我得到了更多的错误。我还按照这里的说明自己构建了OpenCV,但我仍然得到与预构建框架相同的错误。
我错过了什么?我的项目中是否还需要更改其他内容?
更新:
此处所示,将“C++标准库”设置为“libc++(带有C++ 11支持的LLVM C++标准库)”只产生了一个错误:

clang: error: invalid deployment target for -stdlib=libc++ (requires iOS 5.0 or later)

将部署目标更改为iOS 5最终使我的项目重新运行。
这是否意味着OpenCV 2.4.3不适用于早于5的iOS版本?

你可能想查看这篇文章,Mach O链接错误-链接器命令失败,退出码为1(使用-v查看调用),以解决你的链接器错误。让我们知道它的进展如何。 - Douglas
好的,我刚刚更新了问题。更改C++标准库并将部署目标设置为5就解决了问题。这是否意味着新的OpenCV版本不支持早于5的iOS版本? - Darkshore Grouper
7个回答

6

在Mac OS X Lion 10.7.5上使用CMake 2.8.10和Xcode 4.6.1编译运行C++ OpenCV 2.4.4的步骤

准备必需工具

  1. http://sourceforge.net/projects/opencvlibrary/files/下载OpenCV-Unix并将其解压到任意位置
  2. http://www.cmake.org/cmake/resources/software.html下载并安装CMake .dmg
  3. 我假设你已经在OS X Lion上安装了带有iOS SDK 6.1的Xcode 4.6
  4. 前往Xcode首选项中下载并安装命令行工具,以便您可以使用g++等工具

使用CMake编译OpenCV

  1. go to the extracted opencv folder
  2. create a build directory

    mkdir build
    cd build
    cmake -D WITH_TBB=OFF -D BUILD_NEW_PYTHON_SUPPORT=OFF -D BUILD_FAT_JAVA_LIB=OFF -D BUILD_TBB=OFF -D BUILD_EXAMPLES=ON -D CMAKE_CXX_COMPILER=g++ CMAKE_CC_COMPILER=gcc -D CMAKE_OSX_ARCHITECTURES=x86_64 -D BUILD_opencv_java=OFF -G "Unix Makefiles" ..
    make -j8
    sudo make install
    
  3. from the build folder, go to bin/ and run one of the tests

    ./opencv_test_stitching
    

创建自己的C++ OpenCV Xcode项目

  1. 启动Xcode并创建新的Xcode项目
  2. 在OS X下选择命令行工具作为项目类型
  3. 打开项目的构建设置
  4. 在架构下,将架构设置为64位Intel。同时将有效架构设置为x86_64
  5. 在编译选项下,将C/C++编译器设置为默认编译器
  6. 在搜索路径下,将头文件搜索路径设置为/usr/local/include
  7. 同样在搜索路径下,将库搜索路径设置为/usr/local/lib
  8. 在Apple LLVM编译器4.2 - 语言下,将C++标准库设置为libstd++(对于OpenCV 2.4.6、Xcode 5、LLVM 5.0和10.8.5,请将语言方言和标准库都设置为“编译器默认”,而不是“libstd++”)

向项目添加编译好的OpenCV库

  1. 转到构建设置选项卡旁边的构建阶段选项卡
  2. 在“链接二进制文件与库”中,单击“+”号并选择“添加其他”
  3. 按下键盘上的斜杠/并输入/usr/local/lib
  4. 按下回车并选择要在项目中使用的库
  5. 确保您始终选择libopencv_core.2.4.4.dylib
  6. 按下回车,您将在项目下看到所选择的动态链接库

编写一些代码

  1. 首先让我们组织文件,在项目蓝图图标上右键单击并选择新建组
  2. 将新组命名为OpenCV或其他名称
  3. 将dylibs拖放到该组中
  4. 打开main.cpp文件
  5. 从任何带OpenCV的示例测试中复制代码,并将其粘贴到此处
  6. 确保已添加所有所需的dylibs,例如如果您将opencv_test_stitching.cpp代码复制到main.cpp中,则需要在上面的步骤中添加以下库 libopencv_core.2.4.4.dylib libopencv_highgui.2.4.4.dylib libopencv_stitching.2.4.4.dylib

干杯!


谢谢!我一直在寻找这样的东西。问题:这将使用libstd++构建OpenCV,而不是像可下载的编译版本那样使用libc++,对吗? - Darkshore Grouper
这肯定会使用libstd++构建OpenCV,但我不确定可下载的编译版本使用了什么。 - user604919
1
使用OpenCV 2.4.6、Xcode 5、LLVM 5.0和10.8.5,我必须将语言方言和std库(步骤8)都设置为“编译器默认值”。否则,我会看到链接器错误(特别是关于imwrite的抱怨),或者缺少<stdint.h>。 - Dave

4
似乎您的项目缺少框架AssetsLibrary
  1. 选择项目导航器中的顶级节点。(出现包含构建设置的项目和目标页面。)

  2. 选择目标。

  3. 选择摘要

  4. 向下滚动到链接的框架和库

  5. 单击表格末尾的加号图标,然后选择AssetsLibrary.framework

  6. 单击添加

然后再次尝试构建它。


感谢您的快速回复。我已经添加了AssetsLibrary.framework,第一个错误确实消失了(这基本上很奇怪,因为在升级之前我没有使用过该框架,而且项目一直运行得很好)。不过我仍然遇到了另外三个错误。 - Darkshore Grouper

4

由于我无法获得关于版本的答案(无论是在这里还是在OpenCV Q& A网站上),所以我要将此帖子发布为答案,因为它至少解决了这个问题。具体描述可以参见这里

在您项目的构建设置中,跳转到Apple LLVM编译器4.1-Language部分。
在那里:
C++ Language Dialect设置为Compiler Default
C++ Standard Library设置为libc ++(LLVM C ++支持C ++ 11的标准库)

执行以上操作后,我不再收到那些链接器错误,而只收到一个错误,其中指出仅支持iOS 5及以上版本。将Deployment Target更改为项目概述中的5.0即可解决问题。

最后需要注意的是,我仍然不确定这意味着OpenCV 2.4.3与早于5的iOS版本的兼容性如何。


我在最近的升级后遇到了同样的问题。尽管我是为iOS 6编译,但这对我有效。我发现将“仅构建活动架构”设置为“是”可以解决一些错误。不确定它是否能帮助你解决问题。目前,我意识到这有点靠运气,我对此并不是很舒服,但既然这暂时解决了我的问题,我会点赞。希望它能引起更多人的注意。谢谢。 - lightalchemist

1

clang: 错误:-stdlib=libc++ 的部署目标无效(需要 iOS 5.0 或更高版本)以消除此错误。

前往 BuildSettings。将 C++ 标准库设置为编译器默认值。该错误一定会被移除。


1

如果您按照所有设置正确的C ++库来构建iOS应用程序的建议,但仍然出现未定义符号的链接错误,请确保将您的代码文件设置为编译为C ++!也就是将您的.m重命名为.mm和.h重命名为.hpp。细节决定成败...


0

不要使用官方网站上OpenCV安装指南中给出的终端命令,而是使用以下命令从终端构建opencv。对我很有用。

cd OpenCV-2.3.1

mkdir build

cd build

cmake -G "Unix Makefiles" ..

make

sudo make install


0
  1. 前往Xcode/General/Linked Frameworks and Libraries
  2. 点击"+"按钮
  3. 输入:AssetsLibrary
  4. 选择"AssetsLibrary.framework"并导入

完成

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接