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

标签 c++ macos qt opencv macports

我想在 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

一切正常...

我的配置: 操作系统 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 是空的?

最佳答案

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

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

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

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

关于c++ - 使用 macports 安装 opencv 并在 qt (osx) 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435419/

相关文章:

使用 Stringstream 的 C++ Hex 到 Int

c - 非阻塞连接上的 MacOSX select() 行为不正确

c++ - 如何使用 QGraphicsScene::setStyle()?

xcode - 如何将钥匙串(keychain)从一台开发机器导入另一台开发机器

linux - 如何在Qt 4.5.2中设计 float 工具栏

javascript - Qt QScript 加密

c++ - SHFileOperation 无法删除文件夹

c++ - 我什么时候使用 "__attribute__((nonnull))"与 "not_null<T*>"?

c++ - 类中的内联函数

Android 设备监视器在 Mac OS X 上卡住