【问题标题】:compiling opencv 2.4 on a 64 bit mac in Xcode在 Xcode 的 64 位 mac 上编译 opencv 2.4
【发布时间】:2013-10-25 05:51:55
【问题描述】:

我有一个我一直在 ubuntu 12.04 下开发的 opencv 项目,在具有 x86_64 架构的 mac 上的 parellels VM 上。我认为有许多屏幕切换性能问题是由于 VM 造成的,其中 linux 视频模式会翻转几秒钟,而摄像头访问是由 opencv 应用程序进行的。我决定将项目移到电脑mac端的Xcode中继续opencv开发。但是,我对 xcode 不太熟悉,并且无法让项目在那里正确构建。

我已经安装了 xcode。 我在 mac 上下载并解压缩了最新版本的 opencv,然后运行:~/src/opencv/build/cmake-gui -G Xcode .. 根据来自 willowgarage 和其他各种位置的说明。 这似乎工作正常(但是我现在想知道我是否在这里缺少架构设置,尽管它在 Xcode 中是 64 位英特尔)。 然后,我使用 linux 项目中的源文件设置了一个 xcode 项目,并将包含目录更改为使用 /opt/local/include/... 而不是 /usr/local/include/... 我将 xcode 切换为在项目的构建设置中使用 LLVM GCC 编译器 然后将 Apple LLVM Dialog for C++ 设置为 Language Dialect to GNU++11(这似乎与上面的行不一致)

我没有在 xcode 中使用 makefile,(我知道 - 它有自己的项目文件...)

我还遇到了一个链接器问题,看起来可以通过添加此链接器标志来解决:

   -lopencv_video  

基于此处的类似帖子:other thread 但是在这种情况下,这个人在他们的项目中使用了 Makefile。

我已尝试在 xcode 构建设置的“其他链接器标志”下添加此链接器标志,但仍然出现构建错误。
我想我在这里可能有两个问题,一个是使用 Cmake 构建 opencv 库时的架构设置,另一个是我的项目中的链接器标志设置。

目前构建错误列表如下所示:

    Undefined symbols for architecture x86_64:
    "cv::_InputArray::_InputArray(cv::Mat const&)", referenced from:
    _main in main.o
    "cv::_OutputArray::_OutputArray(cv::Mat&)", referenced from:
    _main in main.o
    "cv::Mat::deallocate()", referenced from:
    cv::Mat::release()    in main.o
    "cv::Mat::copySize(cv::Mat const&)", referenced from:
    cv::Mat::Mat(cv::Mat const&)in main.o
    cv::Mat::operator=(cv::Mat const&)in main.o
    "cv::Mat::Mat(_IplImage const*, bool)", referenced from:
    _main in main.o
   "cv::imread(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)", referenced from:
   _main in main.o
   ---SNIP---
   ld: symbol(s) not found for architecture x86_64
   collect2: ld returned 1 exit status

谁能提供一些关于下一步要尝试什么的指导?

谢谢, 沃尔特

【问题讨论】:

    标签: opencv


    【解决方案1】:

    使用 cmake 2.8.10 和 xcode 4.6.1 在 mac os x lion 10.7.5 上编译和运行 c++ opencv 2.4.4 的步骤 编辑:在 mac os x mountain lion 10.8.3 和 Xcode 4.5 上使用 opencv 2.4.5 成功测试

    拥有合适的工具

    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-photo
      

    创建自己的 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,请将语言方言和标准库设置为“编译器默认值”)李>

    将编译好的 opencv 库添加到您的项目中

    1. 转到您所在的“构建设置”选项卡旁边的“构建阶段”选项卡
    2. 在 Link Binary With Libraries 中,单击 + 号并选择 Add Other
    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

    干杯。

    【讨论】:

    • 非常感谢...这解决了我的问题..问题出在“C++ 标准库”上。默认情况下是“libc++”。将其更改为“libstdc++”就可以了。再次非常感谢您
    • 很棒的教程让我比其他大多数人走得更远。 xcode 5 和 OpenCV 2.4.6.1 有什么变化吗?我在 sudo make install 期间遇到了一些错误,但我会尝试自行追踪它们。谢谢!
    • 根据这条评论(stackoverflow.com/questions/14030546/…),是的,有变化。 “使用 OpenCV 2.4.6、Xcode 5、LLVM 5.0 和 10.8.5,我必须将语言方言和 std 库(步骤 8)都设置为“编译器默认值”。否则我会看到链接器错误(专门抱怨 imwrite ),或缺少 。"我更新了答案。希望它对你有用。
    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 2011-04-24
    • 2013-04-03
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多