#c #linux #qt #gcc
#c #linux #qt #gcc
Вопрос:
Я выполняю кросс-сборку приложения QT с компьютера Debian (Stretch) на Debian (Jessie) BeagleBone Black, и когда я выполнил это, я получил сообщение
/home/bbuser/totemguard/totemguard: /usr/lib/arm-linux-gnueabihf/libstdc .so.6: version `GLIBCXX_3.4.22' not found (required by /home/bbuser/totemguard/totemguard)
Я увидел, что версия armhf g была 6.1, поэтому я установил версию 4.9.2-10 (ту же, что у меня была на BeagleBone Black) и перекомпилировал свой код с аналогичным результатом (другая версия GLIBXX):
/home/bbuser/totemguard/totemguard: /usr/lib/arm-linux-gnueabihf/libstdc .so.6: version `GLIBCXX_3.4.21' not found (required by /home/bbuser/totemguard/totemguard)
Читая политику и рекомендации ABI, версия G для GLIBCXX_3.4.21 равна 5.1.0:
GCC 4.9.0: GLIBCXX_3.4.20, CXXABI_1.3.8
GCC 5.1.0: GLIBCXX_3.4.21, CXXABI_1.3.9
GCC 6.1.0: GLIBCXX_3.4.22, CXXABI_1.3.10
Но у меня никогда не была установлена версия 5.1 на моем главном компьютере или на доске BeagleBone.
Перечисляя каталог /usr/lib/arm-linux-gnueabihf/, мы видим, что существуют только версии GCC 4.9.0 и GCC 6.1.0 libstdc :
lrwxrwxrwx 1 root root 19 ago 3 15:53 libstdc .so.6 -> libstdc .so.6.0.22
-rw-r--r-- 1 root root 658064 dic 27 2014 libstdc .so.6.0.20
-rw-r--r-- 1 root root 1019632 ago 3 15:53 libstdc .so.6.0.22
Эта проблема возникает после обновления дистрибутива с jessie до stretch, и я не могу обновить версию beaglebone black gcc.
Что я могу сделать?
ПРАВКА 1: на тестовой плате (BeagleBone Black) Я добавил репозиторий stretch и сделал это:
bbuser@beaglebone:~/totemguard$ sudo apt-cache policy libstdc 6
libstdc 6:
Installed: 4.9.2-10
Candidate: 6.1.1-11
Version table:
6.1.1-11 0
500 http://ftp.us.debian.org/debian/ stretch/main armhf Packages
*** 4.9.2-10 0
500 http://ftp.us.debian.org/debian/ jessie/main armhf Packages
100 /var/lib/dpkg/status
bbuser@beaglebone:~/totemguard$ sudo apt-get install libstdc 6
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
gcc-6-base
The following NEW packages will be installed:
gcc-6-base
The following packages will be upgraded:
libstdc 6
1 upgraded, 1 newly installed, 0 to remove and 726 not upgraded.
Need to get 517 kB of archives.
...
И приложение работало нормально (не проверено на 100%, но ошибок не выдает). Тем не менее, это тестовая плата, и я не могу сделать то же самое на рабочей плате.
Ответ №1:
решение 1) используйте -static (полные библиотеки) или компилируйте только libstdc в качестве статического для двоичного файла
решение 2) распространять соответствующую версию libstdc с двоичным файлом (возможно, с использованием LD_PRELOAD)
решение 3) используйте точно такую же версию g libstdc для перекрестной компиляции (по крайней мере, совпадающую)
обычно лучше использовать решение 1) — у вас не будет проблем с обновлением дистрибутивов
Комментарии:
1. Я попробовал «решение 3», соответствующее версиям g и gcc (оно поставляется с libstdc 3.4.20, но оно по-прежнему ссылается на 3.4.21. Вот в чем моя проблема. Я попробую решение 1 через несколько дней. Спасибо.
2. это связано с тем, что новая библиотека все еще присутствует в среде кросс-компиляции. Вы можете просто удалить ее или передать неявно определенную при компиляции: gcc my_prog.cpp /usr/lib/libstdc .so.6.xx.x -lother_libraries