将Xcode升级到4.5.2并将OpenCV升级到2.4.3后出现链接器错误

时间:2012-12-25 12:11:33

标签: ios xcode opencv linker-errors

我的项目工作正常,直到今天早上。我使用的是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中的objc-class-ref(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框架,我删除了对旧框架的引用,并将项目引用到从here下载的官方预构建opencv2.framework。 我还删除了对 libz.dylib 的引用,并添加了对 libc ++。dylib 的引用。
最后一步是将前缀文件更新为新框架。前缀文件中的相关部分现在如下所示:

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

这一切都缩小到我无法摆脱的4个链接器错误。我尝试使用 libstdc ++。dylib ,但我得到了更多的错误。我也尝试按照here的说明自己构建OpenCV,但我仍然遇到与预构建框架相同的错误。

我错过了什么?我的项目还需要改变什么吗?

更新:
here所示,设置&#34; C ++标准库&#34; to&#34; libc ++(LLVM C ++标准库,支持C ++ 11&#34;只产生一个错误:

  

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

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

7 个答案:

答案 0 :(得分:6)

使用cmake 2.8.10和xcode 4.6.1在mac os x lion 10.7.5上编译和运行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上有xcode 4.6,其中包括ios sdk 6.1
  4. 转到xcode首选项以下载并安装命令行工具,以便您使用g ++等。
  5. 使用cmake编译opencv

    1. 转到解压缩的opencv文件夹
    2. 创建构建目录

      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. 从构建文件夹
    4. 转到bin /并运行其中一个测试

      ./opencv_test_stitching
      
    5. 创建自己的c ++ opencv xcode项目

      1. 启动xcode并创建一个新的xcode项目
      2. 为os x
      3. 下的项目类型选择命令行工具
      4. 打开项目的构建设置
      5. 在架构下,将架构设置为64位英特尔。还将Valid Architectures设置为x86_64
      6. 在Build Options下,将Compiler for C / C ++设置为Default Compiler
      7. 在“搜索路径”下,将“标题搜索路径”设置为/ usr / local / include
      8. 也在“搜索路径”下,将“库搜索路径”设置为/ usr / local / lib
      9. 在Apple LLVM编译器4.2下 - 语言集C ++标准库到libstd ++(对于OpenCV 2.4.6,Xcode 5,LLVM 5.0和10.8.5,将语言方言和标准库设置为“编译器默认值”而不是“libstd ++” “)
      10. 将已编译的opencv库添加到项目中

        1. 转到
        2. 中“构建设置”标签旁边的“构建阶段”标签
        3. 在Link Binary With Libraries中,单击+号并选择Add Other
        4. 点击键盘上的前斜杠/并输入/ usr / local / lib
        5. 按Enter键并选择要在项目中使用的库
        6. 确保您始终选择libopencv_core.2.4.4.dylib
        7. 按Enter键,您将在项目下看到所选的dylib
        8. 写一些代码

          1. 首先让我们整理文件,右键单击项目蓝图图标,然后选择新建组
          2. 将新组命名为opencv或其他
          3. 拖动dylib并将其放入该组
          4. 打开main.cpp
          5. 从opencv附带的任何样本测试中复制代码并将其粘贴到此处
          6. 确保添加了所有必需的dylib,例如,如果将opencv_test_stitching.cpp代码复制到main.cpp中,则需要在前面的步骤中添加以下库 libopencv_core.2.4.4.dylib libopencv_highgui.2.4.4.dylib libopencv_stitching.2.4.4.dylib
          7. 干杯。

答案 1 :(得分:4)

您的项目似乎缺少框架 AssetsLibrary

  1. 在项目导航器中选择顶部节点。 (将显示包含构建设置的项目和目标页面。)

  2. 选择目标。

  3. 选择摘要

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

  5. 点击表格末尾的 Plus 图标,然后选择 AssetsLibrary.framework

  6. 点击添加

  7. 然后尝试再次构建它。

答案 2 :(得分:4)

由于我似乎无法得到有关版本的答案(无论是在这里还是在OpenCV Q&amp; A网站上),我都会将此作为答案发布,因为它至少解决了这个问题。这被描述为here
在项目的构建设置中,请转到 Apple LLVM编译器4.1-语言部分。
有:
C ++语言方言设置为编译器默认
C ++标准库设置为 libc ++(带有C ++ 11支持的LLVM C ++标准库

完成上述操作后,我停止了获取这些链接器错误,而只收到一个错误,表示只支持iOS 5及更高版本。在项目总结中将部署目标更改为5.0可以解决问题
最后,我还不确定OpenCV 2.4.3与5岁以上iOS版本兼容的含义。

答案 3 :(得分:1)

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

  

GoTo BuildSettings。将c ++标准库设置为编译器默认值。该   错误肯定会被删除。

答案 4 :(得分:1)

只是为了让其他人遇到同样的事情而将其发布到某个地方。如果您遵循所有关于设置正确的c ++库以建立iOS应用程序的好建议,但仍然会得到未定义符号的链接错误,请确保您的代码文件设置为编译为c ++!这是将你的.m重命名为.mm和.h为.hpp。这是小事......

答案 5 :(得分:0)

使用以下命令从终端构建opencv,而不是使用官方网站的opencv安装指南中给出的终端命令。为我工作。

cd OpenCV-2.3.1

mkdir build

cd build

cmake -G&#34; Unix Makefiles&#34; ..

sudo make install

答案 6 :(得分:0)

  1. 转到Xcode /常规/链接的框架和库
  2. 按“+”按钮
  3. type:AssetsLibrary
  4. 选择“AssetsLibrary.framework”并将其导入
  5. 完成

    祝你好运!