【问题标题】:Linker errors after upgrading Xcode to 4.5.2 and OpenCV to 2.4.3将 Xcode 升级到 4.5.2 和 OpenCV 升级到 2.4.3 后的链接器错误
【发布时间】:2012-12-11 10:03:12
【问题描述】:

直到今天早上,我的项目都运行良好。我使用的是 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)中的 objc-class-ref
“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 所见,将“C++ 标准库”设置为“libc++(支持 C++ 11 的 LLVM C++ 标准库”仅产生一个错误:

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

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

【问题讨论】:

  • 您可能想查看这篇文章,Mach O Link Error-linker command failed with exit code 1 (use -v to see invocation),以了解您的链接器错误。让我们知道进展如何。
  • 好的,我刚刚更新了问题。更改 C++ 标准库并将部署目标设置为 5 就可以了。这是否意味着新的 OpenCV 版本不支持 5 之前的 iOS 版本?

标签: ios xcode opencv linker-errors


【解决方案1】:
  1. Go Xcode/通用/链接框架和库
  2. 按“+”按钮
  3. 类型:AssetsLibrary
  4. 选择“AssetsLibrary.framework”并导入

完成

祝你好运!

【讨论】:

    【解决方案2】:

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

    cd OpenCV-2.3.1

    mkdir 构建

    cd 构建

    cmake -G "Unix Makefiles" ..

    制作

    sudo 安装

    【讨论】:

      【解决方案3】:

      使用 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++ 等。

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

        ./opencv_test_stitching
        

      创建自己的 c++ opencv xcode 项目

      1. 启动 xcode 并创建一个新的 xcode 项目
      2. os x下项目类型选择命令行工具
      3. 打开项目的构建设置
      4. 在架构下,将架构设置为 64 位英特尔。还将有效架构设置为 x86_64
      5. 在 Build Options 下,将 Compiler for C/C++ 设置为 Default Compiler
      6. 在 Search Paths 下,将 Header Search Paths 设置为 /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. 在 Link Binary With Libraries 中,单击 + 号并选择添加其他
      3. 在键盘上点击前斜杠 / 并输入 /usr/local/lib
      4. 回车并选择要在项目中使用的库
      5. 确保始终选择 libopencv_core.2.4.4.dylib
      6. 回车,你会在你的项目下看到选定的dylibs

      写一些代码

      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

      干杯。

      【讨论】:

      • 谢谢!我一直在寻找类似的东西。问题:这将使用 libstd++ 构建 OpenCV,而不是像可下载的编译版本那样的 libc++,对吧?
      • 这肯定会使用 libstd++ 构建 OpenCV,但是我不确定可下载的编译版本使用了什么。
      • 对于 OpenCV 2.4.6、Xcode 5、LLVM 5.0 和 10.8.5,我必须将语言方言和标准库(步骤 8)都设置为“编译器默认值”。否则我会看到链接器错误(专门抱怨 imwrite),或者缺少 .
      【解决方案4】:

      只是为了在某个地方发布这个帖子,以防其他人遇到同样的事情。如果您遵循有关设置正确的 c++ 库以链接构建 iOS 应用程序的所有重要建议,但仍然会出现未定义符号的链接错误,请确保您的代码文件设置为编译为 c++!那就是将您的 .m 重命名为 .mm 并将 .h 重命名为 .hpp。都是些小事……

      【讨论】:

        【解决方案5】:

        clang: error: invalid deployment target for -stdlib=libc++(需要 iOS 5.0 或更高版本)来消除此错误。

        转到构建设置。将 c++ 标准库设置为编译器默认值。这 错误肯定会被删除。

        【讨论】:

          【解决方案6】:

          由于我似乎无法获得有关版本的答案(无论是在此处还是在 OpenCV 问答网站上),我将把它作为答案发布,因为它至少解决了这个问题。这被描述为here

          在您项目的 Build Settings 中,转到 Apple LLVM compiler 4.1-Language 部分。
          那里:
          C++ 语言方言 设置为 编译器默认值
          C++ 标准库 设置为 libc++(支持 C++ 11 的 LLVM C++ 标准库

          完成上述操作后,我不再收到那些链接器错误,而是只收到一个错误,表示仅支持 iOS 5 及更高版本。在项目摘要中将 部署目标 更改为 5.0 即可。

          最后一点,关于 OpenCV 2.4.3 与低于 5 的 iOS 版本的兼容性,我仍然不确定这意味着什么。

          【讨论】:

          • 我最近升级后遇到了同样的问题。这对我有用,即使我正在为 iOS 6 进行编译。我发现将“仅构建活动架构”设置为“是”为我解决了一些错误。不确定它是否有助于解决您的问题。此刻,我意识到这有点像碰碰运气,我对此不太满意,但由于这解决了我的问题(目前),我正在投票。希望它能引起更多人的关注。谢谢。
          【解决方案7】:

          您的项目似乎缺少框架AssetsLibrary

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

          2. 选择目标。

          3. 选择摘要

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

          5. 点击表格末尾的加号图标并选择AssetsLibrary.framework

          6. 点击添加

          然后尝试重新构建它。

          【讨论】:

          • 感谢您的快速回复。我添加了 AssetsLibrary.framework,第一个错误确实消失了(这基本上很奇怪,因为我在升级之前没有使用框架,并且项目运行良好)。不过,我仍然遇到其他 3 个错误。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-15
          • 1970-01-01
          • 2011-07-21
          相关资源
          最近更新 更多