Собрать проект С++ в статике с использованием статических библиотек OpenCV
Пытаюсь собрать простой проект на С++ (просто объявить в 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 \
-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_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: error: ld returned 1 exit status
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
Если я добавляю к CMakeLists.txt строку "link_libraries(jpeg.a "-static")" Выводиться следующая ошибка CLion:
[ 50%] Linking CXX executable OpenCVTest
/usr/bin/ld: невозможно найти -lQt5::Core
/usr/bin/ld: невозможно найти -lQt5::Gui
/usr/bin/ld: невозможно найти -lQt5::Widgets
/usr/bin/ld: невозможно найти -lQt5::Test
/usr/bin/ld: невозможно найти -lQt5::Concurrent
/usr/bin/ld: невозможно найти -lQt5::OpenGL
/usr/bin/ld: невозможно найти -lEigen3::Eigen
collect2: error: ld returned 1 exit status
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
Если после этого я переделываю 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 project needs to be reloaded" и там я нажимаю на "Reload changes" и 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" я ведь явно указал как статическую библиотеку!): -- 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
После этого, если я нажимаю "Build" (Ctrl+F9), то проект ЯКОБЫ собирается, но файл не выполняется и CLion выводит следующую ошибку:
/home/sergey/CLionProjects/untitled1/cmake-build-debug/OpenCVTest
Process finished with exit code 127
При попытке запуска через терминал происходит следующее:
bash: ./OpenCVTest: Нет такого файла или каталога
При сборке проекта в Release ничего толком не меняется:
Т.е. проект в 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.
Вывод "file ./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 дает вывод:
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Уже установлен пакет libjpeg-dev самой новой версии (8c-2ubuntu8).
Обновлено 0 пакетов, установлено 0 новых пакетов, для удаления
отмечено 0 пакетов, и 134 пакетов не обновлено.
Вывод команды $ sudo find / -type f -name "libjpeg.a":
/home/sergey/Загрузки/jpegsrc.v8b/jpeg-8b/.libs/libjpeg.a
/home/sergey/Загрузки/opencv-master/lib/x64/libjpeg.a
/home/sergey/Загрузки/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’: Отказано в доступе
find: ‘/run/user/1000/gvfs’: Отказано в доступе
find: ‘/proc/1644/task/1644/net’: Недопустимый аргумент
find: ‘/proc/1644/net’: Недопустимый аргумент
find: ‘/proc/1648/task/1648/net’: Недопустимый аргумент
find: ‘/proc/1648/net’: Недопустимый аргумент
find: ‘/proc/1653/task/1653/net’: Недопустимый аргумент
find: ‘/proc/1653/net’: Недопустимый аргумент
find: ‘/proc/1706/task/1706/net’: Недопустимый аргумент
find: ‘/proc/1706/net’: Недопустимый аргумент
Пробовал также собрать этот проект с помощью Makefile:
default:
g++ main.cpp -o test -Wl,-Bstatic `pkg-config --cflags --libs --static
opencv4` -Wl,--as-needed
Вот какой вывод пишет make:
/usr/bin/ld: невозможно найти -lQt5Core
/usr/bin/ld: невозможно найти -lQt5Gui
/usr/bin/ld: невозможно найти -lQt5Widgets
/usr/bin/ld: невозможно найти -lQt5Test
/usr/bin/ld: невозможно найти -lQt5Concurrent
/usr/bin/ld: невозможно найти -lQt5OpenGL
/usr/bin/ld: /usr/local/lib/libopencv_core.a(opencl_core.cpp.o): в
функции «opencl_check_fn(int)»:
opencl_core.cpp:(.text._ZL15opencl_check_fni+0x11a): предупреждение:
Using 'dlopen' in statically linked applications requires at runtime
the shared libraries from the glibc version used for linking
/usr/bin/ld: невозможно найти -lGL
collect2: error: ld returned 1 exit status
make: *** [Makefile:2: default] Ошибка 1
А вот привожу отдельный вывод "":
-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 столкнулся. P.S.: НИГДЕ в Интернете решения данной проблемы не приведено (во всяком случае недельные поиски ничего не дали)
