首页 > 解决方案 > 使用 OpenCV 静态库在静态中构建 C++ 项目

问题描述

我正在尝试在静态中构建一个简单的 C++ 项目(只需在 main.cpp 中声明一个 cv :: Mat 类型的对象)。什么都没有出来。我认为我尝试了互联网上描述的所有方法 - 另一台计算机上的项目仍然无法启动。我在 CLion 中收集项目(使用 CMakeLists.txt 组装),但在 g ++ 中也可以使用解决方案。Ubuntu 操作系统 20.04 LTS。OpenCV 版本 4.2.0。在静态中构建 OpenCV 的脚本

######################################
# INSTALL OPENCV ON UBUNTU OR DEBIAN #
######################################

# -------------------------------------------------------------------- |
#                       SCRIPT OPTIONS                                 |
# ---------------------------------------------------------------------|
OPENCV_VERSION='4.2.0'       # Version to be installed
OPENCV_CONTRIB='NO'          # Install OpenCV's extra modules (YES/NO)
# -------------------------------------------------------------------- |

# |          THIS SCRIPT IS TESTED CORRECTLY ON          |
# |------------------------------------------------------|
# | OS               | OpenCV       | Test | Last test   |
# |------------------|--------------|------|-------------|
# | Ubuntu 20.04 LTS | OpenCV 4.2.0 | OK   | 25 Apr 2020 |
# |----------------------------------------------------- |
# | Debian 10.2      | OpenCV 4.2.0 | OK   | 26 Dec 2019 |
# |----------------------------------------------------- |
# | Debian 10.1      | OpenCV 4.1.1 | OK   | 28 Sep 2019 |
# |----------------------------------------------------- |
# | Ubuntu 18.04 LTS | OpenCV 4.1.0 | OK   | 22 Jun 2019 |
# | Debian 9.9       | OpenCV 4.1.0 | OK   | 22 Jun 2019 |
# |----------------------------------------------------- |
# | Ubuntu 18.04 LTS | OpenCV 3.4.2 | OK   | 18 Jul 2018 |
# | Debian 9.5       | OpenCV 3.4.2 | OK   | 18 Jul 2018 |



# 1. KEEP UBUNTU OR DEBIAN UP TO DATE    

sudo apt-get -y update
# sudo apt-get -y upgrade       # Uncomment to install new versions of packages currently     installed
# sudo apt-get -y dist-upgrade  # Uncomment to handle changing dependencies with new vers. of pack.
# sudo apt-get -y autoremove    # Uncomment to remove packages that are now no longer needed


# 2. INSTALL THE DEPENDENCIES

# Build tools:
sudo apt-get install -y build-essential cmake

# GUI (if you want GTK, change 'qt5-default' to 'libgtkglext1-dev' and remove '-DWITH_QT=ON'):
sudo apt-get install -y qt5-default libvtk6-dev

# Media I/O:
sudo apt-get install -y zlib1g-dev libjpeg-dev libwebp-dev libpng-dev libtiff5-dev libjasper-dev \
                    libopenexr-dev libgdal-dev

# Video I/O:
sudo apt-get install -y libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev \
                    libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev yasm \
                    libopencore-amrnb-dev libopencore-amrwb-dev libv4l-dev libxine2-dev

# Parallelism and linear algebra libraries:
sudo apt-get install -y libtbb-dev libeigen3-dev

# Python:
sudo apt-get install -y python-dev  python-tk  pylint  python-numpy  \
                    python3-dev python3-tk pylint3 python3-numpy flake8

# Java:
sudo apt-get install -y ant default-jdk

# Documentation and other:
sudo apt-get install -y doxygen unzip wget


# 3. INSTALL THE LIBRARY

wget https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip
unzip ${OPENCV_VERSION}.zip && rm ${OPENCV_VERSION}.zip
mv opencv-${OPENCV_VERSION} OpenCV

if [ $OPENCV_CONTRIB = 'YES' ]; then
  wget https://github.com/opencv/opencv_contrib/archive/${OPENCV_VERSION}.zip
  unzip ${OPENCV_VERSION}.zip && rm ${OPENCV_VERSION}.zip
  mv opencv_contrib-${OPENCV_VERSION} opencv_contrib
  mv opencv_contrib OpenCV
fi

cd OpenCV && mkdir build && cd build

if [ $OPENCV_CONTRIB = 'NO' ]; then
cmake -DWITH_QT=ON -DWITH_OPENGL=ON -DFORCE_VTK=ON -DWITH_TBB=ON -DWITH_GDAL=ON \
      -DBUILD_SHARED_LIBS=OFF \
      -DOPENCV_GENERATE_PKGCONFIG=YES \
      -DWITH_XINE=ON -DENABLE_PRECOMPILED_HEADERS=OFF ..
fi

if [ $OPENCV_CONTRIB = 'YES' ]; then
cmake -DWITH_QT=ON -DWITH_OPENGL=ON -DFORCE_VTK=ON -DWITH_TBB=ON -DWITH_GDAL=ON \
      -DWITH_XINE=ON -DENABLE_PRECOMPILED_HEADERS=OFF \
      -DBUILD_SHARED_LIBS=OFF \
      -DOPENCV_GENERATE_PKGCONFIG=YES \
      -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ..
fi

make -j8
sudo make install
sudo ldconfig


# 4. EXECUTE SOME OPENCV EXAMPLES AND COMPILE A DEMONSTRATION

# To complete this step, please visit 'http://milq.github.io/install-opencv-ubuntu-debian'.

CMakeList.txt

cmake_minimum_required(VERSION 3.14) 
project(OpenCVTest)
set(CMAKE_CXX_STANDARD 14)
find_package(OpenCV REQUIRED)
set(OpenCV_SHARED OFF)
include_directories(${OpenCV_INCLUDE_DIRS})                     
link_libraries(${OpenCV_LIBS} "-static") 
add_executable(OpenCVTest example.cpp)

这个人的情况几乎是一对一的,显然,没有人能帮上忙:https ://github.com/opencv/opencv/issues/14825

构建 CLion 时会产生以下错误:

Scanning dependencies of target OpenCVTest
[ 50%] Building CXX object CMakeFiles/OpenCVTest.dir/example.cpp.o
[100%] Linking CXX executable OpenCVTest
/usr/bin/ld: 

尝试静态链接动态对象 «/usr/lib/x86_64-linux-gnu/libjpeg.so» collect2: 错误: ld 返回 1 退出状态 make[3]: *** [CMakeFiles/OpenCVTest.dir/build.make :127: OpenCVTest] 错误 1 ​​make[2]: *** [CMakeFiles/Makefile2:73: CMakeFiles/OpenCVTest.dir/all] 错误 2 make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/OpenCVTest .dir/rule] 错误 2 make: *** [Makefile:118: OpenCVTest] 错误 2

如果我将 link_libraries (jpeg.a "-static") 行添加到 CMakeLists.txt 会显示以下 CLion 错误:

[ 50%] Linking CXX executable OpenCVTest
/usr/bin/ld: impossible to find -lQt5::Core
/usr/bin/ld: impossible to find -lQt5::Gui
/usr/bin/ld: impossible to find -lQt5::Widgets
/usr/bin/ld: impossible to find -lQt5::Test
/usr/bin/ld: impossible to find -lQt5::Concurrent
/usr/bin/ld: impossible to find -lQt5::OpenGL
/usr/bin/ld: impossible to find -lEigen3::Eigen
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/OpenCVTest.dir/build.make:127: OpenCVTest]     Error 1
make[2]: *** [CMakeFiles/Makefile2:73: CMakeFiles/OpenCVTest.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/OpenCVTest.dir/rule] Error 2
make: *** [Makefile:118: OpenCVTest] Error 2

如果在那之后我重做 CMakeLists.txt 如下:

cmake_minimum_required(VERSION 3.14)
project(OpenCVTest)
set(CMAKE_CXX_STANDARD 14)
find_package(OpenCV REQUIRED)
set(OpenCV_SHARED OFF)
message(NOTICE ${OpenCV_LIBS})
find_package(Qt5Gui REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Test REQUIRED)
find_package(Qt5Concurrent REQUIRED)
find_package(Qt5OpenGL REQUIRED)
find_package(Eigen3 REQUIRED)
find_package(Boost REQUIRED)
link_libraries(jpeg.a "-static")
include_directories(${OpenCV_INCLUDE_DIRS})
link_libraries(${OpenCV_LIBS} "-static")
link_libraries(${Qt5Gui_LIBS} "-static")
link_libraries(${Qt5Core_LIBS} "-static")
link_libraries(${Qt5Widgets_LIBS} "-static")
link_libraries(${Qt5Test_LIBS} "-static")
link_libraries(${Qt5Concurrent_LIBS} "-static")
link_libraries(${Qt5OpenGL_LIBS} "-static")
link_libraries(${Eigen3_LIBS} "-static")
link_libraries(${Boost_LIBS} "-static")
add_executable(OpenCVTest example.cpp)

更改 CMakeLists.txt 时,顶部的 CLion 显示“需要重新加载 CMake 项目”行,然后单击“重新加载更改”,CMake 显示以下内容(这不是程序集):

/home/sergey/My_Folder/clion-2019.1.3/CLion-2019.1.3/clion- 
2019.1.3/bin/cmake/linux/bin/cmake
-DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" 
/home/sergey/CLionProjects/untitled1                                
NOTICEopencv_calib3dopencv_coreopencv_dnnopencv_features2d \
opencv_flannopencv_gapiopencv_highguiopencv_imgcodecsopencv_imgproc \
opencv_mlopencv_objdetectopencv_photoopencv_stitchingopencv_video \
opencv_videoio \
-- Boost  found.
-- Using CMake version: 3.14.3
-- Compiling dlib version: 19.20.0
-- Found system copy of libpng: /usr/lib/x86_64-linux-    
gnu/libpng.so;/usr/lib/x86_64-linux-gnu/libz.so
-- Found system copy of libjpeg: /usr/lib/x86_64-linux-gnu/libjpeg.so
-- Searching for BLAS and LAPACK
-- Searching for BLAS and LAPACK
-- Checking for module 'cblas'
--   No package 'cblas' found
-- Found OpenBLAS library
-- Using OpenBLAS's built in LAPACK
-- C++11 activated.
-- Configuring done
-- Generating done
-- Build files have been written to:         /home/sergey/CLionProjects/untitled1/cmake- 
build-debug

[Finished]

这两行对我来说特别尴尬(毕竟我明确指出“jpeg.a”是静态库!): -- 找到libpng的系统副本:/usr/lib/x86_64-linux-gnu/libpng.so; /usr/lib/x86_64-linux-gnu/libz.so -- 找到 libjpeg 的系统副本:/usr/lib/x86_64-linux-gnu/libjpeg.so

之后,如果我按“构建”(Ctrl + F9),则应该构建项目,但文件未执行,CLion 显示以下错误:

/home/sergey/CLionProjects/untitled1/cmake-build-debug/OpenCVTest
Process finished with exit code 127

尝试通过终端启动时,会发生以下情况:

bash: ./OpenCVTest: No such file or directory

那些。Release 中的项目应该也在进行中,但它在启动时失败并出现同样的错误:

/home/sergey/CLionProjects/untitled1/cmake-build-release/OpenCVTest
Process finished with exit code 127

假定编译的文件的 ldd 的输出显示如下:

sergey@sergey-VirtualBox:~/CLionProjects/untitled1/cmake-build-debug$ ldd OpenCVTest
linux-vdso.so.1 (0x00007ffea0521000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7947dba000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7947bc8000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7947a79000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f7947fbd000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7947a5e000)

“$ ls -l ./OpenCVTest”:

 -rwxrwxr-x 1 sergey sergey 17176 июн 24 11:03 ./OpenCVTest. 

“$ 文件 ./OpenCVTest”:

./OpenCVTest: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),         
dynamically linked, interpreter /lib/ld64.so.1, 
BuildID[sha1]=78cea86b11bd32907f177e2261683132bc23a8b8, for GNU/Linux 
3.2.0, not stripped

尝试安装“libjpeg-dev”的输出: $ sudo apt install libjpeg-dev 给出了输出:

Reading package lists ... Done
Building a dependency tree
Read status information ... Done
The latest version libjpeg-dev package (8c-2ubuntu8) is already installed.
Updated 0 packages, installed 0 new packages to remove
0 packages were marked, and 134 packages were not updated.

$ sudo find / -type f -name "libjpeg.a":

/home/sergey/Downloads/jpegsrc.v8b/jpeg-8b/.libs/libjpeg.a
/home/sergey/Downloads/opencv-master/lib/x64/libjpeg.a
/home/sergey/Downloads/opencv-master/lib/i386/libjpeg.a
/home/sergey/.local/share/Trash/files/libjpeg.a
/usr/lib/x86_64-linux-gnu/libjpeg.a
/usr/local/lib/libjpeg.a
find: ‘/ run / user / 1000 / doc’: Access denied
find: ‘/ run / user / 1000 / gvfs’: Access denied
find: ‘/ proc / 1644 / task / 1644 / net’: Invalid argument
find: ‘/ proc / 1644 / net’: Invalid argument
find: ‘/ proc / 1648 / task / 1648 / net’: Invalid argument
find: ‘/ proc / 1648 / net’: Invalid argument
find: ‘/ proc / 1653 / task / 1653 / net’: Invalid argument
find: ‘/ proc / 1653 / net’: Invalid argument
find: ‘/ proc / 1706 / task / 1706 / net’: Invalid argument
find: ‘/ proc / 1706 / net’: Invalid argument

我还尝试使用 Makefile 构建这个项目。:

default:
g++ main.cpp -o test -Wl,-Bstatic `pkg-config --cflags --libs --static 
opencv4` -Wl,--as-needed

这是输出:

/ usr / bin / ld: cannot find -lQt5Core
/ usr / bin / ld: cannot find -lQt5Gui
/ usr / bin / ld: cannot find -lQt5Widgets
/ usr / bin / ld: cannot find -lQt5Test
/ usr / bin / ld: cannot find -lQt5Concurrent
/ usr / bin / ld: cannot find -lQt5OpenGL
/ usr / bin / ld: /usr/local/lib/libopencv_core.a(opencl_core.cpp.o): in
functions "opencl_check_fn (int)":
opencl_core.cpp :(. text._ZL15opencl_check_fni + 0x11a): warning:
Using 'dlopen' in statically linked applications requires at runtime
the shared libraries from the glibc version used for linking
/ usr / bin / ld: cannot find -lGL
collect2: error: ld returned 1 exit status
make: *** [Makefile: 2: default] Error 1

这是一个单独的结论“pkg-config --cflags --libs --static opencv4”:

-I/usr/local/include/opencv4/opencv -I/usr/local/include/opencv4 - 
L/usr/local/lib -L/usr/local/lib/opencv4/3rdparty - 
L/home/sergey/My_Folder/Face_recognition/bush_script_install
_and_build_OpenCV/OpenCV/build/lib 
-lopencv_dnn -lopencv_gapi -lopencv_highgui - 
lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching - 
lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_flann - 
lopencv_videoio -lopencv_imgcodecs -lopencv_imgproc -lopencv_core - 
littnotify -llibprotobuf -llibjasper -lIlmImf -lquirc -lippiw -lippicv 
-lade -lQt5Core -lQt5Gui -lQt5Widgets -lQt5Test -lQt5Concurrent - 
lQt5OpenGL -ljpeg -lwebp -lpng -lz -ltiff -lgdal -ldl -lm -lpthread - 
lrt -lGL -lGLU

在使用 OpenCV 的静态装配过程中遇到了这种奇怪的行为。PS .:互联网上的任何地方都没有解决这个问题(无论如何,每周的搜索都没有给出任何结果)

标签: c++clinuxopencvcmake

解决方案


推荐阅读