为了测试目的,我需要使用静态库来编译我的C++ opencv程序。我的cmake构建选项是:
-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读取类似的问题/线程,我试着编译我的程序,在构建顺序非常重要的情况下使用以下方法:
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但是,它只会产生许多错误,例如:
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。是否找到了所需的库以及使用静态库构建的正确顺序?
更新:在使用以下方法修复脚本之后,现在只有几个错误:
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我现在才有:
/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发布于 2019-03-29 07:07:19
在到处搜索之后。我终于做到了。我使用码头集装箱作为我的工作环境。我使用的是OpenCV 4.0.1和Ubuntu18.04。我的停靠文件可以在DockerFile找到。(码头映像仍然是动态生成的,只需按照下面的步骤来启用静态构建。)
要成功地进行静态编译,基本上有两件事要做。
-D BUILD_SHARED_LIBS=OFF
和-D OPENCV_GENERATE_PKGCONFIG=YES第二个选项将为您节省在编译期间手动链接所有库的麻烦。这是非常关键的。在编译过程中,我使用了典型的:
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
https://stackoverflow.com/questions/55234833
复制相似问题