首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编译静态OpenCV4库?

如何编译静态OpenCV4库?
EN

Stack Overflow用户
提问于 2019-03-19 06:24:55
回答 1查看 1.1K关注 0票数 2

为了测试目的,我需要使用静态库来编译我的C++ opencv程序。我的cmake构建选项是:

代码语言:javascript
复制
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D BUILD_DOCS=OFF \
    -D BUILD_EXAMPLES=OFF \
    -D BUILD_opencv_apps=OFF \
    -D BUILD_opencv_python2=ON \
    -D BUILD_opencv_python3=ON \
    -D BUILD_PERF_TESTS=OFF \
    -D BUILD_SHARED_LIBS=OFF \ 
    -D BUILD_TESTS=OFF \
    -D ENABLE_PRECOMPILED_HEADERS=OFF\
    -D FORCE_VTK=OFF \
    -D WITH_FFMPEG=OFF \
    -D WITH_GDAL=OFF \ 
    -D WITH_IPP=OFF \
    -D WITH_OPENEXR=OFF \
    -D WITH_OPENGL=OFF \ 
    -D WITH_QT=OFF\
    -D WITH_TBB=OFF \ 
    -D WITH_XINE=OFF \ 
    -D BUILD_JPEG=ON  \
    -D BUILD_TIFF=ON \
    -D BUILD_PNG=ON \

我可以看到,我在两个/usr/local/libs/ and the headers in /usr/local/include/ .And中都有文件,我有测试程序来显示一个图像,它使用highgui, core and imgcodec libs读取类似的问题/线程,我试着编译我的程序,在构建顺序非常重要的情况下使用以下方法:

代码语言:javascript
复制
    g++ main.cpp -I /usr/local/include/opencv4 -L /usr/local/lib 
    -L /usr/local/share/opencv4 -L /usr/local/lib/opencv4 -lopencv_highgui \
    -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_highgui \
    -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching \
    -lopencv_video -lopencv_imgproc -lopencv_core -ljpeg -lpng -ltiff -lrt \
    -lz -lpthread -o binary

但是,它只会产生许多错误,例如:

代码语言:javascript
复制
    usr/local/lib/libopencv_highgui.a(window_gtk.cpp.o): In function `icvOnKeyPress(_GtkWidget*, _GdkEventKey*, void*)':window_gtk.cpp:(.text._ZL13icvOnKeyPressP10_GtkWidgetP12_GdkEventKeyPv+0x98): undefined reference to `g_mutex_lock'
    window_gtk.cpp:(.text._ZL13icvOnKeyPressP10_GtkWidgetP12_GdkEventKeyPv+0xaa): undefined reference to `g_cond_broadcast'
    window_gtk.cpp:(.text._ZL13icvOnKeyPressP10_GtkWidgetP12_GdkEventKeyPv+0xb6): undefined reference to `g_mutex_unlock'/usr/local/lib/libopencv_highgui.a(window_gtk.cpp.o): In function `cvImageWidgetSetImage(_CvImageWidget*, void const*)':
    window_gtk.cpp:(.text._Z21cvImageWidgetSetImageP14_CvImageWidgetPKv+0x185): undefined reference to `gtk_widget_get_type' /usr/local/lib/libopencv_core.a(opencl_core.cpp.o): In function `OPENCL_FN_clGetExtensionFunctionAddress_switch_fn(char const*)':
opencl_core.cpp:(.text._ZL49OPENCL_FN_clGetExtensionFunctionAddress_switch_fnPKc+0x33): undefined reference to `dlsym'
opencl_core.cpp:(.text._ZL49OPENCL_FN_clGetExtensionFunctionAddress_switch_fnPKc+0x19c): undefined reference to `dlopen'
opencl_core.cpp:(.text._ZL49OPENCL_FN_clGetExtensionFunctionAddress_switch_fnPKc+0x1b3): undefined reference to `dlsym'
opencl_core.cpp:(.text._ZL49OPENCL_FN_clGetExtensionFunctionAddress_switch_fnPKc+0x296): undefined reference to `dlclose'

显然,已经放弃了对pkgconfig的使用,因为OpenCV4。是否找到了所需的库以及使用静态库构建的正确顺序?

更新:在使用以下方法修复脚本之后,现在只有几个错误:

代码语言:javascript
复制
g++ main.cpp -I /usr/local/include/opencv4 -L/usr/local/lib -lopencv_dnn -lopencv_features2d -lopencv_calib3d -lopencv_flann -lopencv_objdetect -lopencv_ml -lopencv_photo -lopencv_video -lopencv_videoio -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_core -lpng -ljpeg -o binary

我现在才有:

代码语言:javascript
复制
/usr/bin/ld: /usr/local/lib/libopencv_core.a(persistence.cpp.o): undefined reference to symbol 'gzeof'
//lib/x86_64-linux-gnu/libz.so.1: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-29 07:07:19

在到处搜索之后。我终于做到了。我使用码头集装箱作为我的工作环境。我使用的是OpenCV 4.0.1和Ubuntu18.04。我的停靠文件可以在DockerFile找到。(码头映像仍然是动态生成的,只需按照下面的步骤来启用静态构建。)

要成功地进行静态编译,基本上有两件事要做。

  1. -D BUILD_SHARED_LIBS=OFF
  2. -D OPENCV_GENERATE_PKGCONFIG=YES

第二个选项将为您节省在编译期间手动链接所有库的麻烦。这是非常关键的。在编译过程中,我使用了典型的:

代码语言:javascript
复制
g++ main.cpp -o test `pkg-config --cflags --libs --static opencv4`

只需记住将$PKG_CONFIG_PATH设置为opencv4.pc所处的位置。

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

您可以通过以下几个方面来检查它:echo $PKG_CONFIG_PATH,我希望这能帮助任何人努力做到这一点!

编辑:**Dockerfile

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55234833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档