【问题标题】:Setting up OpenCV in QT on OSX在 OSX 上的 QT 中设置 OpenCV
【发布时间】:2013-07-05 07:11:29
【问题描述】:

我正在尝试在 OSX 10.7.5/MacbookPro 2.5 Ghz Intel Core 2 Duo 上设置 OpenCV 以与 QT 一起使用。我在这里看到了一些相关的问题(How to link opencv in QtCreator and use Qt libraryHow do you set up OpenCV with QT in OSX?),但没有太多细节。在 QT 网站和我的网络搜索中,所有信息似乎都与 Windows 或 Linux 有关。


我在下面列出了我的设置和代码。当我运行代码时出现错误::-1: error: symbol(s) not found for architecture x86_64

这是否意味着因为路径错误或我可能已经为 x86_32 构建了 openCV 而没有找到东西?有没有办法检查后者?我对部分配置和设置过程不是很了解。


更新 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'

到目前为止我所拥有的(tl;dr):

  • 从源代码构建并安装了最新版本的 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

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”的地方。当然一个lib的全称是“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

【问题讨论】:

  • 默认情况下,OpenCV 2.4.6 是为原生架构构建的(应该是 x86_64)。当您说“运行”时,您如何准确地启动您的代码?这可能与 DYLD_LIBRARY__PATH 不包含 opencv .dylib 文件的路径有关。
  • @sansuiso - 我正在使用 QTCreator 来构建和运行它。我对我的问题添加了更新,以解释我如何尝试指定要包含的库。
  • 它曾经在 10.8 上使用 this .pro file 为我工作,但自从使用 10.9 设置新的开发机器后,我得到了同样的错误。

标签: macos qt opencv


【解决方案1】:

这是我在 OSX 的 QT 中设置 Opencv 所采取的步骤:

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

【讨论】:

    【解决方案2】:

    我只是偶然发现了同样的问题。以下是我的解决方法:

    正如sansuiso 已经建议的那样,问题似乎出在您尝试链接的 C++-STD-lib 上。您可能正在尝试链接 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://stackoverflow.com/a/12852913/1141118

    希望这会有所帮助!

    【讨论】:

    • 谢谢。我单独构建了 openCV,并且能够让它与下面我的答案中的定义链接。
    • CONFIG += c++11 似乎足够了。
    【解决方案3】:

    只是一个天真的错误

    正确的声明是:

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

    【讨论】:

      【解决方案4】:

      您在这里面临 2 个潜在问题:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-30
        • 2017-01-12
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多