在OSX上在QT中设置OpenCV

8
我正在尝试在OS X 10.7.5/MacbookPro 2.5 Ghz Intel Core 2 Duo上设置OpenCV以与QT一起工作。我在这里看到了一些相关的问题(如何链接QtCreator中的OpenCV并使用Qt库如何在OSX中设置OpenCV与QT?),但没有太多细节说明。在QT网站和我的网络搜索中,所有信息似乎都是关于Windows或Linux的。


我列出了我的设置和代码,但运行代码时出现错误::-1:错误:找不到体系结构x86_64的符号

这是否意味着未找到内容是因为路径不正确还是因为我可能已将openCV构建为x86_32?有办法检查后者吗?我对配置和设置过程的某些部分不太熟悉。


更新2

下面是控制台输出——也许错误很明显?

02:44:38: Running steps for project RP_openCV_01...
02:44:38: Configuration unchanged, skipping qmake step.
02:44:38: Starting: "/usr/bin/make" 
clang++ -headerpad_max_install_names -mmacosx-version-min=10.6 -o RP_openCV_01 main.o   -L/usr/local/lib -1ibopencv_core.2.4.6,dylib -1ibopencv_imgproc.2.4.6.dylib -F/Users/rise/Qt5.0.2/5.0.2/clang_64/lib -framework QtCore 
clang: warning: argument unused during compilation: '-1ibopencv_core.2.4.6,dylib'
clang: warning: argument unused during compilation: '-1ibopencv_imgproc.2.4.6.dylib'
Undefined symbols for architecture x86_64:
  "cv::_InputArray::_InputArray(cv::Mat const&)", referenced from:
      _main in main.o
  "cv::namedWindow(std::string const&, int)", referenced from:
      _main in main.o
  "cv::Mat::deallocate()", referenced from:
      _main in main.o
  "cv::imread(std::string const&, int)", referenced from:
      _main in main.o
  "cv::imshow(std::string const&, cv::_InputArray const&)", referenced from:
      _main in main.o
  "cv::waitKey(int)", referenced from:
      _main in main.o
  "cv::fastFree(void*)", 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: *** [RP_openCV_01] Error 1
02:44:38: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project RP_openCV_01 (kit: Desktop Qt 5.0.2 clang 64bit)
When executing step 'Make'

目前为止我所做的事情(简短概括):

  • 从源代码构建和安装了最新版本的openCV(2.4.6),并通过一些命令行程序进行了测试。

  • 安装了最新版本的QT(5.1),能够运行所有示例等。

  • 在项目文件中指定了路径(如下所示)

QT       += core
QT       -= gui

TARGET = RP_openCV_01
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app
SOURCES += main.cpp

INCLUDEPATH += /usr/local/include\
LIBS += -L/usr/local/lib
  • 尝试在项目设置(如下图)中指定路径。我添加了/usr/local/include/usr/local/lib

enter image description here

在main.cpp中是一个简单的示例代码。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int main() {

    // read an image
    cv::Mat image= cv::imread("dog.jpg");
    // create image window named "My Image"
    cv::namedWindow("My Image");
    // show the image on window
    cv::imshow("My Image", image);
    // wait key for 5000 ms
    cv::waitKey(5000);

    return 1;
}

更新1

我尝试根据一篇教程的指导,在QT配置文件中指定库(如下图所示)。该教程是针对Windows操作系统的,我不知道OSX操作系统是否有所不同。在Windows示例中,它是 -1ibopencv_core246d,我尝试过加上和不加上分隔符,但都没有加上 "d"。当然,库的全名是 "libopencv_core.2.4.6.dylib" 等。

这些重要细节总是让我困扰,但教程通常假定读者已经掌握了这些内容。

 LIBS += -L/usr/local/lib \
     -1ibopencv_core.2.4.6 \
     -1ibopencv_imgproc.2.4.6 \
     -1ibopencv_features2d.2.4.6 \
     -1ibopencv_highgui.2.4.6

enter image description here


默认情况下,OpenCV 2.4.6 是为本机架构(应该是 x86_64)构建的。当您说“运行”时,您如何确切地启动您的代码?这可能与 DYLD_LIBRARY__PATH 不包含 opencv .dylib 文件路径有关。 - sansuiso
@sansuiso - 我正在使用QTCreator来构建和运行这个程序。我更新了我的问题,以解释我如何尝试指定要包含的库。 - spring
以前在10.8上使用这个 .pro 文件可以正常运行,但是自从我用10.9设置了新的开发机器后,出现了相同的错误。 - Christoph
4个回答

9

只是一个幼稚的错误

正确的声明应该是:

LIBS += -L/usr/local/lib \
     -lopencv_core \
     -lopencv_imgproc \
     -lopencv_features2d\
     -lopencv_highgui

1

我刚刚遇到了同样的问题。这是我解决它的方法:

正如sansuiso已经建议的那样,问题似乎是你尝试链接的C++标准库。你可能正在尝试链接libc++(LLVM ...),但应该使用libstdc++(GNU C++ ...)。

使用Qt Creator,您可以将以下内容添加到您的.pro文件中:

mac: CONFIG += MAC_CONFIG

MAC_CONFIG {
    QMAKE_CXXFLAGS = -std=c++11 -stdlib=libstdc++ -mmacosx-version-min=10.7
    QMAKE_LFLAGS = -std=c++11 -stdlib=libstdc++ -mmacosx-version-min=10.7
}

这个答案也可能对您的问题有帮助:https://dev59.com/UWcs5IYBdhLWcg3wiEiK#12852913 希望能对您有所帮助!

谢谢。我单独构建了 openCV,并且能够通过我的下面答案中的定义进行链接。 - spring
CONFIG += c++11 看起来已经足够了。 - CroCo

0

以下是我在OSX上设置Opencv和QT的步骤:

1- 安装QT

2- 安装OpenCV4

3- 在项目文件中添加以下行:

INCLUDEPATH += /usr/local/include/opencv4\

LIBS += -L/usr/local/lib \
     -lopencv_core \
     -lopencv_imgproc \
     -lopencv_features2d\
     -lopencv_highgui

QMAKE_MACOSX_DEPLOYMENT_TARGET = 11.0

4- 在项目部分,在构建部分下,取消选中以下内容:

Add build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATH

以下链接可能会有所帮助:

Dlink

Warning Version


0

您在这里面临两个潜在的问题:

  1. 第一个问题是,在 Mac 平台上,取决于编译器(clang 或 gcc),您将无法链接到相同的 stdc++ 库(我在尝试让一些静态 opencv lib 与 iOS 项目配合工作时遇到了这个问题)。但是,由于您没有 C++ 错误,因此似乎不是这种情况,但检查每种情况下使用的编译器仍然值得一试;
  2. 第二个问题是,QtCreator 是一个图形应用程序。因此,它不知道您的终端会话设置。这包括 /usr/local 中动态库的路径。您可以通过不同的方法避免这种情况:使用静态 opencv lib、使用 install_tool 来更改输出二进制文件中编码的库的路径,或者使用 QtCreator 的首选项来设置 DYLD_LIBRARY_PATH 变量为类似于 /usr/local/lib 的内容,当它运行您的程序时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接