Arhn - архитектура программирования

Как исправить ошибку неопределенной ссылки при компиляции OpenCV?

Я загрузил алгоритм Eigenfaces на С++ с официального сайта OpenCV и скомпилировал его с помощью этой команды:

g++ `pkg-config --cflags --libs opencv` facerec_eigenfaces.cpp -o opencv

Но я получаю эти ошибки:

/tmp/cc0CsJ0b.o: In function `norm_0_255(cv::_InputArray const&)':
facerec_eigenfaces.cpp:(.text+0x51): undefined reference to `cv::noArray()'
facerec_eigenfaces.cpp:(.text+0x65): undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
facerec_eigenfaces.cpp:(.text+0x9b): undefined reference to `cv::normalize(cv::_InputArray const&, cv::_OutputArray const&, double, double, int, int, cv::_InputArray const&)'
facerec_eigenfaces.cpp:(.text+0xa2): undefined reference to `cv::noArray()'
facerec_eigenfaces.cpp:(.text+0xb6): undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
facerec_eigenfaces.cpp:(.text+0xec): undefined reference to `cv::normalize(cv::_InputArray const&, cv::_OutputArray const&, double, double, int, int, cv::_InputArray const&)'

Я не копирую сюда всю тему, но все они являются «неопределенной ссылкой», и моя версия OpenCV такая же, как ссылка, которую я упомянул.

Вывод (pkg-config --cflags --libs opencv):

-I/usr/local/include/opencv -I/usr/local/include  /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_contrib.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_gpu.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_legacy.so /usr/local/lib/libopencv_ml.so /usr/local/lib/libopencv_nonfree.so /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_ocl.so /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_superres.so /usr/local/lib/libopencv_ts.a /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videostab.so /usr/local/lib/libopencv_viz.so /usr/lib/i386-linux-gnu/libXext.so /usr/lib/i386-linux-gnu/libX11.so /usr/lib/i386-linux-gnu/libICE.so /usr/lib/i386-linux-gnu/libSM.so /usr/lib/i386-linux-gnu/libGL.so /usr/lib/i386-linux-gnu/libGLU.so -ltbb -lrt -lpthread -lm -ldl 
26.07.2015

  • Что выводит pkg-config --cflags --libs opencv, когда вы вызываете его из командной строки? 26.07.2015
  • @πάνταῥεῖ Я добавил вывод, спасибо. 26.07.2015

Ответы:


1

Гипотеза.

Попробуйте переместить флаги компоновщика в конец команды:

g++  facerec_eigenfaces.cpp -o opencv `pkg-config --cflags --libs opencv`

См. также: Почему порядок, в котором подключаются библиотеки, иногда вызывает ошибки в GCC?

26.07.2015
  • Спасибо. оно работает. не могли бы вы объяснить (простыми словами), почему это должно быть в конце? 26.07.2015
  • @chosipa Короче говоря, правило библиотеки идут после объектов, которые их используют, применяется во многих дистрибутивах GCC для связывания общих библиотек только по мере необходимости. В вашем случае объектный файл facerec_eigenfaces.o, созданный из исходного файла facerec_eigenfaces.cpp, зависит от библиотек OpenCV (точный список задается командой pkg-config), и поэтому библиотеки должны идти после этого файла. Вы также можете заметить тот же шаблон в выводе pkg-config: например, X11, pthreads и другие системные зависимости Linux идут после зависимых библиотек OpenCV. См. связанные вопросы и ответы для подробных объяснений. 26.07.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..