#c #opencv #ubuntu
#c #opencv #ubuntu
Вопрос:
После смены Ubuntu с 16.04 на 18.04 и OpenCV с 3.4.1 на 4.1.0 я не могу скомпилировать … ничего
Шаг за шагом:
Я скачал исходный код с github, установил эти флаги:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules cmake -DENABLE_PRECOMPILED_HEADERS=OFF -DBUILD_opencv_cudacodec=OFF -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D WITH_QT=OFF -D BUILD_SHARED_LIBS=OFF ..
скомпилировал его и установил
Затем я создал простую программу:
#include "opencv2/highgui.hpp"
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
cout << "V: " << CV_VERSION << endl;
return 0;
}
Скомпилировал его с помощью этой команды:
g -std=c 11 main.cpp `pkg-config --libs --cflags opencv4` -g -o main
и получить рабочий исполняемый файл main:
V: 4.1.0-pre
Но когда я добавил одну строку с мат
#include "opencv2/highgui.hpp"
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
cout << "V: " << CV_VERSION << endl;
Mat frame;
return 0;
}
Я получил больше ошибок, чем может отобразить мой терминал
Я полагаю, что файлы, подобные libopencv_core.a, не связаны
Этот метод связывания библиотек всегда работал у меня, я не знаю, где искать ошибки
Какие-либо подсказки, советы?
Редактировать:
Вот начало моей ошибки (полная ошибка содержит 4500 строк, если необходимо, я могу добавить .txt с полной ошибкой)
/usr/local/lib/libopencv_core.a(system.cpp.o): In function `cv::ipp::getIPPSingleton()':
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv 0xdb): undefined reference to `ippicvGetCpuFeatures'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv 0x16e): undefined reference to `ippicvSetCpuFeatures'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv 0x173): undefined reference to `ippicvGetEnabledCpuFeatures'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv 0x1ba): undefined reference to `ippicviGetLibVersion'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv 0x263): undefined reference to `pthread_mutexattr_init'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv 0x270): undefined reference to `pthread_mutexattr_settype'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv 0x283): undefined reference to `pthread_mutexattr_destroy'
system.cpp:(.text._ZN2cv3ippL15getIPPSingletonEv 0x2a1): undefined reference to `ippicvInit'
/usr/local/lib/libopencv_core.a(system.cpp.o): In function `cv::getInitializationMutex()':
system.cpp:(.text._ZN2cv22getInitializationMutexEv 0x63): undefined reference to `pthread_mutexattr_init'
system.cpp:(.text._ZN2cv22getInitializationMutexEv 0x70): undefined reference to `pthread_mutexattr_settype'
system.cpp:(.text._ZN2cv22getInitializationMutexEv 0x83): undefined reference to `pthread_mutexattr_destroy'
Ответ №1:
Я бы запустил pkg-config --libs --cflags opencv4
в bash и проверил, верны ли параметры компоновщика и существуют ли пути / библиотеки. make install
должен сообщить вам, куда копируются библиотеки ( /usr/local/lib
или что-то в этом роде). Если #include
работает, включаемые каталоги обычно настроены правильно.
Комментарии:
1.
pkg-config --libs --cflags opencv4
дал этот ответ:-I/usr/local/include/opencv -I/usr/local/include -L/usr/local/lib -lopencv_cudabgsegm -lopencv_cudaobjdetect
… (затем многие другие lopencv_) кажется, что все связано хорошо, я изменил свой вопрос и добавил часть ошибки, потому что это моя единственная подсказка2. Вы также получаете ошибки компоновщика pthread, что обычно означает, что pthread не установлен, но тогда вы не сможете собрать opencv? флаги компилятора выглядят хорошо, по крайней мере, то, что вы написали. Я также не уверен, как opencv обрабатывает материал ippi / откуда он берется. Вы также могли бы попробовать отключить некоторые параметры при сборке opencv (
-D WITH_CUDA=ON -D WITH_TBB=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1
)
Ответ №2:
Возникла та же проблема. Это решается после создания
sudo ldconfig
из той же папки, из которой я запустил установку.
Попробуйте и внимательно посмотрите.
Ответ №3:
Наконец я нашел решение, этот флаг был виноват: -D BUILD_SHARED_LIBS=OFF
, после его удаления все работало нормально
Ответ №4:
Хотя переключение на динамическое связывание, возможно, решило эту проблему, обычно вам приходится связываться с отсутствующими библиотеками в статической сборке.
В этом случае вы должны связать, по крайней мере, с pthread
и libippicv
в соответствии с вашими сообщениями об ошибках.
Ответ №5:
статическое связывание должно включать больше зависимостей
Ваш код
#include "opencv2/highgui.hpp"
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
cout << "V: " << CV_VERSION << endl;
Mat frame;
return 0;
}
выполняется на моей системе (64-разрядная версия win 8.1, opencv 4.2.0. скомпилирован с помощью BUILD_SHARED_LIBS = OFF, компилятор mingw-w64) с использованием пакетного скрипта
set gcc="C:Program Files (x86)mingw-w64i686-8.1.0-posix-dwarf-rt_v6-rev0mingw32bing .exe"
set path_opencv=C:opencv-4.2.0-vc14_vc15opencvbuild
%gcc% code.cpp -I"%path_opencv%include" -L"%path_opencv%x64mingw-w64lib" -lopencv_core420 -lz -lpthread
Как обсуждалось на платформе opencv answers после выключения BUILD_SHARED_LIBS слишком много неопределенных ссылок статическое связывание не пересылает зависимости. Поэтому нам необходимо дополнительно связать библиотеки -lz -lpthread
.
Кроме того, важен порядок следования флагов -l…. Это означает, что открытые зависимости собираются и удовлетворяются следующими библиотеками. Прочитайте Укажите библиотеки, которые будет использовать компоновщик для получения дополнительной информации.
исправление в вашем коде
Достаточно включить #include <opencv2/core/core.hpp>
вместо highgui
и imgproc
. Это так, как определено в cv::Mat core
. По этой причине флаг -lopencv_core420
достаточен и -lopencv_highgui -lopencv_imgproc
не нужен.