c++ - 静态链接 C++ OpenCV

标签 c++ opencv c++11

我想与 OpenCV 库进行静态链接,但我遇到了一些问题。
我使用 Linux (Ubuntu)、IDE Clion、cmake 和库 OpenCV。

当我运行项目时出现错误:

[50%] Linking CXX executable OpenCVLinkingStatic /usr/bin/ld:
attempted static link of dynamic object `/usr/lib/x86_64-linux-gnu/libopencv_videostab.so.2.4.9'
collect2: error: ld returned 1 exit status
CMakeFiles/OpenCVLinkingStatic.dir/build.make:112: recipe for target 'OpenCVLinkingStatic' failed
make[3]: *** [OpenCVLinkingStatic] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/OpenCVLinkingStatic.dir/all' failed
make[2]: *** [CMakeFiles/OpenCVLinkingStatic.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/OpenCVLinkingStatic.dir/rule' failed
make[1]: *** [CMakeFiles/OpenCVLinkingStatic.dir/rule] Error 2
Makefile:118: recipe for target 'OpenCVLinkingStatic' failed
make: *** [OpenCVLinkingStatic] Error 2

CMakeListst.txt:

cmake_minimum_required(VERSION 3.10)
project(OpenCVLinkingStatic)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenCV REQUIRED)
set(SOURCE_FILES main.cpp)
add_executable(OpenCVLinkingStatic main.cpp)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(OpenCVLinkingStatic ${OpenCV_LIBS} "-static")

main.cpp :

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

using namespace cv;

int main(int argc, char** argv) {

   Mat image = imread("/opt/my.jpg", CV_LOAD_IMAGE_COLOR);
   namedWindow("Display window", WINDOW_AUTOSIZE);
   imshow("Display window", image);
   waitKey(0);

   return 0;
}

我在终端中通过命令“sudo apt-get install libopencv-dev”安装了 openCV 库。

我有所有需要的带有扩展“.a”的实验室:

libopencv_core.a
libopencv_highgui.a
libopencv_video.a
libopencv_objdetect.a

它们位于“/usr/lib/x86_64-linux-gnu/”。

当我尝试执行命令时:

"gcc -static -std=c++11 main.cpp
/usr/lib/x86_64-linux-gnu/libopencv_core.a 
/usr/lib/x86_64-linux-gnu/libopencv_highgui.a 
/usr/lib/x86_64-linux-gnu/libopencv_video.a 
/usr/lib/x86_64-linux-gnu/libopencv_objdetect.a 
-lm -lpthread -lstdc++ -o MyBinary".

我得到很多行,每次都包含典型错误:

"/usr/lib/x86_64-linux-gnu/libopencv_core.a(persistence.cpp.o): In function
icvCloseFile(CvFileStorage*) :
(.text._ZL12icvCloseFileP13CvFileStorage+0x52): undefined reference to  gzclose 
/usr/lib/x86_64-linux-gnu/libopencv_core.a(persistence.cpp.o): In function  icvEof(CvFileStorage*) :
(.text._ZL6icvEofP13CvFileStorage+0x42): undefined reference to  gzeof...
/usr/lib/x86_64-linux-gnu/libopencv_highgui.a(window_gtk.cpp.o): In function
cvImageWidget_class_init(_CvImageWidgetClass*) :
(.text._ZL24cvImageWidget_class_initP19_CvImageWidgetClass+0xa): undefined reference to  gtk_widget_get_type 
/usr/lib/x86_64-linux-gnu/libopencv_highgui.a(window_gtk.cpp.o): In function  cvImageWidget_class_init(_CvImageWidgetClass*) :
(.text._ZL24cvImageWidget_class_initP19_CvImageWidgetClass+0x15): undefined reference to  gtk_type_class 
/usr/lib/x86_64-linux-gnu/libopencv_highgui.a(window_gtk.cpp.o): In function  cvImageWidget_class_init(_CvImageWidgetClass*) 
(.text._ZL24cvImageWidget_class_initP19_CvImageWidgetClass+0x20): undefined
reference to  g_type_check_class_cast 
collect2: error: ld returned 1 exit status"

早些时候,我通过源和指定参数“-DBUILD_SHARED_LIBS=OFF”构建了 openCV。
但它没有用,但是我有所有扩展名为“.a”的库。
我收到错误“indefined cv::imread”和其他类似的错误。
如果我使用动态链接,则一切正常。
你能帮我解决这个问题吗?
谢谢。

最佳答案

通常在静态链接的情况下,Open CV 核心库需要一些 3-d 方库。例如 zlib

关于c++ - 静态链接 C++ OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49914782/

相关文章:

c++ - 原始指针和智能指针混合函数重载

c++ - 使用未声明的标识符 C++

c++ - boost::optional 的单元测试

c++ - 几个直方图的平均直方图

c++ - C++11 constexpr 函数中的常量表达式字符串参数

c++ - Linux下使用distutils交叉编译python扩展

java - 裁剪图像的中心

python - 使用opencv检测矩形

c++ - 尝试理解编译器错误信息 : default member initializer required before the end of its enclosing class

C++ 参数类型和效率