Компиляция против специальной версии armhf g

#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