调用静态 opencv 库

Invoking static opencv library

本文关键字:opencv 静态 调用      更新时间:2023-10-16

我基于这篇文章构建了一个静态 opencv 库,之后我想为我的应用程序调用静态 opencv 库。但是,应用程序似乎无法链接静态opencv库,并且它给了我以下警告:

ld: warning: ignoring file /usr/local/lib/libopencv_core.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libopencv_core.a
ld: warning: ignoring file /usr/local/lib/libopencv_highgui.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libopencv_highgui.a
ld: warning: ignoring file /usr/local/lib/libopencv_imgproc.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libopencv_imgproc.a
ld: warning: ignoring file /usr/local/lib/liblibjasper.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibjasper.a
ld: warning: ignoring file /usr/local/lib/liblibjpeg.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibjpeg.a
ld: warning: ignoring file /usr/local/lib/liblibpng.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibpng.a
ld: warning: ignoring file /usr/local/lib/liblibtiff.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibtiff.a
ld: warning: ignoring file /usr/local/lib/libzlib.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libzlib.a
ld: warning: ignoring file /usr/local/lib/libIlmImf.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libIlmImf.a

在我看来,应用程序正在尝试调用动态 opencv 库,而仅调用cv::Mat测试的简单应用程序会给我以下错误:

Undefined symbols for architecture i386:
  "cv::Mat::deallocate()", referenced from:
      cv::Mat::release() in main.o
  "cv::fastFree(void*)", referenced from:
      cv::Mat::~Mat() in main.o

编辑:正如答案所表明的那样,这不是链接问题,而是链接为不同架构构建的库的问题。除此之外,在构建和使用静态 OpenCV 库时,您应该注意的另外两件重要事情是:

  1. 确保它仅构建活动架构(是)。

  2. 此外,您应该链接opencv_highgui.a使用的framework Cocoa;general;-framework QTKit;general;-framework QuartzCore;general;-framework AppKit;

这不是关于不成功的链接,而是关于不成功的构建。"文件是为存档而构建的,而不是正在链接的体系结构 (i386)"。您需要正确构建它,也就是说,为正确的体系结构构建它。

我相信通过

不向命令行传递任何选项cmake它确实为机器的本机架构构建了库(这是默认选项),大概是x86_64。但是,出于某种原因,您正在尝试在此处构建一个 32 位 i386 应用程序。因此,您的体系结构没有正确的静态库。

你可以通过构建 32 位 -Darch=i386 OpenCV 来解决它 cmake ),或者通过构建 64 位应用程序(原生架构或 x86_64,具体取决于您的构建系统)。

如果你觉得勇敢,你也可以构建 32 位和 64 位静态库,将它们组装成一个通用二进制文件,并链接到该通用库。

您应该使用以下方法构建本地应用程序:

cmake .. -DOpenCV_DIR=/path/to/opencv-3.0.0-beta/build/ -DCMAKE_OSX_ARCHITECTURES=x86_64

即。强制x86_64本地构建,这就是opencv版本。