Ошибка кросс-компиляции GLIBCXX версии ссылки - PullRequest
0 голосов
/ 24 апреля 2020

Я настраиваю проект для малины и сталкиваюсь с ошибкой компоновки, которую я не понимаю.

Контекст:

На самом деле, я кросс-скомпилировал Qt и все работали штрафы. Теперь я пытаюсь заставить opencv работать и для обработки изображений в моем приложении Qt. Вместо кросс-компиляции opencv я установил его с помощью apt install и синхронизировал мой целевой sys root в ~ / raspi / sys root. Чтобы получить управление камерой raspi, я использую библиотеки mmal (расположены в rpi в / opt / vc / lib). Я скрестил скомпилированный Qt с g cc -linaro-7.4.1-2019.02-x86_64_arm- linux -gnueabihf, так что qmake также использует его. Raspi использует Raspian Buster Lite, который использует довольно старый glib c (причина использования g cc -linaro-7.4.1, рекомендуется в документации Qt mkspe c)

Проблема:

Когда я пытаюсь скомпилировать простую основную. cpp, компоновщик не работает при компоновке библиотек opencv:

~/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libopenmpt.so.0: undefined reference to `std::random_device::_M_getentropy() const@GLIBCXX_3.4.25'

На моем raspy версия glib c равна

$ strings /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_DEBUG_MESSAGE_LENGTH

Вопрос:

Я не понимаю, как opengl не может сделать ссылку на символ, который установлен на моем распи для моего рапси? Я попытался скомпилировать этот код на распи и все ссылки правильно. Чего мне не хватает?

Приложение: ошибка команды

~/Documents/personal/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -mfloat-abi=hard --sysroot=~/raspi/sysroot -Wl,-O1 -Wl,-rpath,/usr/local/qt5pi/lib -Wl,-rpath-link,~/raspi/qt5pi/lib -Wl,-rpath-link,~/raspi/sysroot/usr/lib/arm-linux-gnueabihf -Wl,-rpath-link,~/raspi/sysroot/lib/arm-linux-gnueabihf -o photomata main.o   -L~/raspi/sysroot/opt/vc/lib/ -lopencv_core -lopencv_videoio -lopencv_highgui -lraspicam -lmmal -lmmal_core -lmmal_util -lmmal_vc_client -lmmal_components -lvchiq_arm -lvcsm -lcontainers -lvcos -lbcm_host ~/raspi/qt5pi/lib/libQt5MultimediaWidgets.so ~/raspi/qt5pi/lib/libQt5Widgets.so ~/raspi/qt5pi/lib/libQt5Multimedia.so ~/raspi/qt5pi/lib/libQt5Gui.so ~/raspi/qt5pi/lib/libQt5Network.so ~/raspi/qt5pi/lib/libQt5Core.so -L~/raspi/sysroot/usr/lib/arm-linux-gnueabihf -lGLESv2 -lpthread 

..................

Спасибо Вы нашли время, чтобы прочитать и, возможно, помочь мне.

Проблема продолжается на Отсутствует crt1.o / crti.o для кросс-компиляции

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Таким образом, версия компилятора является причиной, есть две опции:

  • Перекомпилировать opencv с помощью g cc -linaro-7.4.1
  • Использовать компилятор> 8.0.0

Я создал новую проблему по адресу: Отсутствует crt1.o / crti.o для кросс-компиляции

0 голосов
/ 25 апреля 2020

На моем raspy, glib c версия

Ваш вопрос не имеет ничего общего с GLIB C. Речь идет о libstdcxx.

Я не понимаю, как opengl не может сделать ссылку на символ, который установлен

То, что установлено в вашей целевой системе, не не имеет значения. Важно то, с какими библиотеками вы ссылаетесь на хосте .

Из таблицы G CC ABI вы можете сказать, что GLIBCXX_3.4.25 сначала определен в G CC -8.0.0 и (или более поздней) является версией G CC, которая использовалась для сборки libopenmpt.so.0.

Однако вы пытаетесь связать эту библиотеку с gcc-7.4.1 и против libstdc++.so.6, который пришел с это. Так как означает, что libstdc++.so.6 не определяет необходимый символ, ваша ссылка не работает.

Вам необходимо либо перестроить libopenmpt из исходного кода с помощью компилятора 7.4.1, либо обновить его до своего компилятор для g cc -8.0.0 (или выше).

PS strings является неправильным способом go о выяснении, какие версии определены в библиотеке. Вместо этого используйте readelf -V.

...