Собрать проект С++ в статике с использованием статических библиотек 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.: НИГДЕ в Интернете решения данной проблемы не приведено (во всяком случае недельные поиски ничего не дали)


Ответы (0 шт):