使用 macports 安装 opencv 并在 qt (osx) 中使用

Posted

技术标签:

【中文标题】使用 macports 安装 opencv 并在 qt (osx) 中使用【英文标题】:install opencv with macports and using in qt (osx) 【发布时间】:2013-12-06 23:28:57 【问题描述】:

我想在 mac 上的 qt 中使用 openCV 库。我读了很多关于如何在 qt(我有 5.1)中配置 pro 文件以使用 OpenCV,但对我没有任何作用。 我做了什么:

1) sudo port install opencv
2) sudo port install pkg-config
3) add to *.pro file: LIBS += `pkg-config --libs opencv`

但我只得到错误:

    Target: x86_64-apple-darwin13.0.0
Thread model: posix
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -headerpad_max_install_names -macosx_version_min 10.9.0 -o opencv_pokus3.app/Contents/MacOS/opencv_pokus3 -L/opt/local/lib -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk main.o mainwindow.o moc_mainwindow.o -lopencv_core -lopencv_highgui -framework QtWidgets -framework QtGui -framework QtCore -framework OpenGL -framework AGL -lc++ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.0/lib/darwin/libclang_rt.osx.a -F/Applications/Qt5.1.1/5.1.1/clang_64/lib
Undefined symbols for architecture x86_64:
  "cv::imread(std::string const&, int)", referenced from:
      _main in main.o
  "std::allocator<char>::allocator()", referenced from:
      _main in main.o
  "std::allocator<char>::~allocator()", referenced from:
      _main in main.o
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
      _main in main.o
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [opencv_pokus3.app/Contents/MacOS/opencv_pokus3] Error 1
12:56:15: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project opencv_pokus3 (kit: Desktop Qt 5.1.1 clang 64bit)
When executing step 'Make'
12:56:15: Elapsed time: 00:00.

我尝试将步骤 3 更改为:

LIBS += -L/opt/local/lib \
 -lopencv_calib3d \
 -lopencv_contrib \
 -lopencv_core \
 -lopencv_features2d \
 ...

但是,不幸的是它得到了相同的结果......

PS:我可以通过终端编译openCV helloWorld程序:

g++ `pkg-config --libs --cflags opencv` -o helloWorld  helloOpenCV.cpp
or
clang++ `pkg-config --libs --cflags opencv` -o helloWorld  hello.cpp

一切正常……

我的配置: OSX 10.9, QT 5.1.1, opencv 2.4.7 通过 macports 安装, pkg-config 0.28 通过 macports 安装,

简单的hello world程序:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
...
char var;
cv::Mat img;
img = cv::imread("./imgres.jpg");
cv::namedWindow("Image");
cv::imshow("Image", img);
std::cin >> var;
...

你有什么提示吗,怎么办?

编辑:从终端列出:

pkg-config --libs opencv
/opt/local/lib/libopencv_calib3d.dylib /opt/local/lib/libopencv_contrib.dylib /opt/local/lib/libopencv_core.dylib /opt/local/lib/libopencv_features2d.dylib /opt/local/lib/libopencv_flann.dylib /opt/local/lib/libopencv_gpu.dylib /opt/local/lib/libopencv_highgui.dylib /opt/local/lib/libopencv_imgproc.dylib /opt/local/lib/libopencv_legacy.dylib /opt/local/lib/libopencv_ml.dylib /opt/local/lib/libopencv_nonfree.dylib /opt/local/lib/libopencv_objdetect.dylib /opt/local/lib/libopencv_photo.dylib /opt/local/lib/libopencv_stitching.dylib /opt/local/lib/libopencv_superres.dylib /opt/local/lib/libopencv_ts.a /opt/local/lib/libopencv_video.dylib /opt/local/lib/libopencv_videostab.dylib

pkg-config --libs-only-L opencv

这应该是个问题吗?为什么 -L 是空的?

【问题讨论】:

试试***.com/questions/20342896/… 【参考方案1】:

您没有发布完整的错误消息,也不清楚您使用的是哪个编译器。如果您使用的是 GCC 版本,我想问题可能不是真正找到 OpenCV 库(因为您似乎做得正确),而是这些库中缺少符号。

这可能是因为 Apple 在 10.9 中将默认 C++ 运行时库更改为 libc++。此更改还引入了不同的 C++ 符号处理方案,即使用 clang 针对 libc++ 构建的 OpenCV 库中的符号与给定 OpenCV 标头的 g++ 生成的符号不同——我相信这就是您看到缺少符号的原因。

即使符号处理相同,使用 g++ 对 MacPorts 的 OpenCV 进行编译也不是一个好主意,因为 g++ 仅支持 libstdc++ 作为运行时,这意味着您自己的软件会尝试使用 libstdc++ 而 OpenCV 会尝试使用使用 libc++ 作为 C++ 运行时。这将在同一进程中混合两个不同(且不兼容)的运行时,并导致未定义的行为(充其量是随机崩溃)。

总而言之,在 10.9 及更高版本中使用 g++ 编译 C++ 代码意味着您还必须使用 g++ 手动编译您需要的所有库。作为替代方案,请尝试使用 clang++ 作为编译器。

【讨论】:

用clang++编译程序也没问题【参考方案2】:

错误发生在椅子和键盘之间...

我按照这个建议继续 Qt5.1/Qt5.2 + Mac OS 10.9 (Mavericks) + XCode 5.0.2, Undefined symbols for architecture x86_64

但我只点击了 qmake 和构建,而不是“全部清理”,所以 main.o 一直为 osx 10.6 编译...

【讨论】:

这实际上与我描述的问题相同。请注意,如果您在同一二进制文件中使用针对 libstdc++ 和来自 MacPorts(使用 libc++)的 OpenCV 构建的二进制 Qt 发行版,则您将混合两个 C++ 运行时,导致未定义行为和崩溃。您需要针对其他 C++ 运行时库重新编译 Qt 或 OpenCV。

以上是关于使用 macports 安装 opencv 并在 qt (osx) 中使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 MacPorts 构建 openCV 时出错

OSX安装MacPorts

mac python opencv

卸载了macports,不能再使用自制软件了

如何在 OSX 上正确安装 Python 以与 OpenCV 一起使用?

Mac中MacPorts安装和使用 MacPorts简介