LINUX.ORG.RU

Сборка проекта под Ubuntu 15.10 и исправление зависимостей

 , , ,


0

2

Здравствуйте! Необходима небольшая консультация. Есть самописный проект на Qt, использующий OpenCV и системные библиотеки (прежде всего, X11 и libpthread). Предварительно был скачан и установлен Cmake-ом OpenCV 2.4.9 (не с официального репозитория Ubuntu (libopencv-dev) ). Далее, возникла необходимость собрать в .deb пакет приложение для загрузки на PPA. Сейчас есть две версии приложения: одна с собранными библиотеками opencv через cmake, другая - с библиотеками libopencv-dev. По первому варианту, не совсем понятно, как добавить в зависимости приложения собранные Cmake-ом библиотеки. (По принципу, как в Windows - просто добавить DLL в директорию с проектом, я так понимаю, работать не будет). По второму варианту - при статической линковке, линкер ругается на отсутствующие .so файлы (на x11).

.pro файл, из которого затем генерируется Makefile. Почему не использовался CMakeLists.txt, отвечу, что пока что трудности с синтаксисом CMake.

  CONFIG(release){
#LIBS += /home/ubuntu/Software/opencv/opencv-release/lib/libopencv_core.so.2.4.9
#LIBS += /home/ubuntu/Software/opencv/opencv-release/lib/libopencv_imgproc.so.2.4.9
#LIBS += /home/ubuntu/Software/opencv/opencv-release/lib/libopencv_highgui.so.2.4.9
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libopencv_core.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libopencv_imgproc.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libopencv_highgui.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libgstreamer-0.10.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libXxf86vm.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libv4l2.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libv4l1.a
}

QMAKE_LFLAGS += -lXxf86vm -lXext -lX11 -lXext 

  • ошибка: mainwindow.o: undefined reference to symbol 'XOpenDisplay'
  • /usr/lib/x86_64-linux-gnu/libX11.so:-1: ошибка: error adding symbols: DSO missing from command line
  • :-1: ошибка: collect2: error: ld returned 1 exit status

Поскольку это мой первый более-менее серьезный проект под Linux, прошу отнестись с пониманием.


более-менее серьезный проект

Тогда ты должен был знать, что раз цель Ubuntu, то собирать надо под LTS версии: https://ru.wikipedia.org/wiki/Список_версий_Ubuntu

Так, наиболее разумно собирать под 12.04 LTS для наибольшей универсальности.

I-Love-Microsoft ★★★★★
()

установлен Cmake-ом

Куда? Небось в /usr/local, а не в /usr.

Ну и кто так указывает либы? Пример:

LIBS += -L/usr/local/opencv -lopencv_core -lopencv_imgproc
и ид.

RazrFalcon ★★★★★
()

QMAKE_LFLAGS += -lXxf86vm -lXext -lX11 -lXext

С порядком линковки поколдуй, ИМХО должно быть:

QMAKE_LFLAGS += -lX11 -lXxf86vm -lXext

EXL ★★★★★
()

По принципу, как в Windows - просто добавить DLL в директорию с проектом, я так понимаю, работать не будет)

man LD_PRELOAD

CrossFire ★★★★★
()
Ответ на: комментарий от RazrFalcon

usr/local

Да, в usr/local/lib. Со статической линковкой возникали проблемы.

N00bie
() автор топика
Ответ на: комментарий от N00bie

Не помогло, потому что ты делаешь какую-то ерудну.

Вот это вообще бред:

  CONFIG(release){
#LIBS += /home/ubuntu/Software/opencv/opencv-release/lib/libopencv_core.so.2.4.9
#LIBS += /home/ubuntu/Software/opencv/opencv-release/lib/libopencv_imgproc.so.2.4.9
#LIBS += /home/ubuntu/Software/opencv/opencv-release/lib/libopencv_highgui.so.2.4.9
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libopencv_core.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libopencv_imgproc.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libopencv_highgui.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libgstreamer-0.10.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libX11.so.6.3.0
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libXxf86vm.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libv4l2.a
LIBS +=  -L/usr/lib/x86_64-linux-gnu/libv4l1.a
}

QMAKE_LFLAGS += -lXxf86vm -lXext -lX11 -lXext 

Перепиши так:

LIBS += -lopencv_core -lopencv_imgproc -lopencv_highgui -lgstreamer-0.10 -lX11 -lXxf86vm -lXext -lv4l2 -lv4l1

А если нужна статика OpenCV, то так:

LIBS += /usr/lib/x86_64-linux-gnu/libopencv_core.a /usr/lib/x86_64-linux-gnu/libopencv_imgproc.a ... -L/usr/lib/x86_64-linux-gnu/ -lX11 -lXxf86vm -lXext ... 

EXL ★★★★★
()

Если libopencv-dev из репозитория никак не подходит, то сделай свой пакет yourprog-libopencv, помести его в свой PPA рядом с пакетом твоей программы и укажи в зависимостях пакета твоей программы. Чтобы не было конфликтов с libopencv из репозитория, желательно файлы как-то переименовать или ставить в отдельную директорию твоей программы

Harald ★★★★★
()
Ответ на: комментарий от EXL

Нет. Требует libz.so.1

:-1: ошибка: /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libopencv_core.a(persistence.cpp.o): undefined reference to symbol 'gzclose'

N00bie
() автор топика
Ответ на: комментарий от EXL

Спасибо. Добавил. Теперь ругается на Threading Building Blocks. Еще вопрос хотел уточнить: в загруженном CV из репозитория Убунты не было динамической библиотеки libopencv_core, только статика(.а) - может ли это влиять на сборку?

N00bie
() автор топика
Ответ на: комментарий от CrossFire

По принципу, как в Windows - просто добавить DLL в директорию с проектом, я так понимаю, работать не будет)

man LD_LIBRARY_PATH

fixed

Stil ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.