Как я могу решить проблему переносимости libstdc ++ - PullRequest
1 голос
/ 12 марта 2020

Я создал двоичный файл, который запускается в моей системе (fedora 30), но когда я хочу запустить его в Ubuntu, я получаю ошибку ниже:

/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./App)

, что является стандартным способом решения этой проблемы ? или мне всегда нужно перестраивать приложение под разными ОС для его запуска?

1 Ответ

1 голос
/ 13 марта 2020

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

Стандартный способ решить эту проблему - определить ваши минимальные требования и затем собрать ваш двоичный файл в таким образом, что он требует только этого минимума и ничего больше.

Например, если вы строите свою программу в дистрибутиве RedHat 7.2 и не используете C ++, ваша программа будет работать на все Linux дистрибутивов, которые не старше 20 лет.

или мне всегда нужно перестраивать свое приложение под разными ОС для его запуска?

Вы не.

В конкретном случае символа версии GLIBCXX_3.4.26 вы создали свой двоичный файл с G CC 9.0.0 (или более поздней версией): см. документ ABI .

Двоичный файл не будет работать ни в одной системе с установленной только средой выполнения G CC -8.x.

Один из способов избежать этого требования - связать с флагом -static-libstdc++. Ваш бинарный файл будет больше (возможно, намного больше), и может потребоваться его распространение в другой форме (из-за вирусной природы GPL; уточните у своего юриста), но он будет работать на более старых дистрибутивах .

В качестве альтернативы, если вы собираете свой бинарный файл "регулярно" на основе дистрибутива на основе G CC -8.x, бинарный файл должен прекрасно работать на более новом, основанном на G CC -9.x.

Другим решением для этого является распределение вашего бинарного файла в docker контейнер, который имеет все необходимые условия.

PS Я не предлагаю вам фактически запустить физический хост RedHat-7.2. Использование изолированной виртуальной машины со старым дистрибутивом только для сборки должно работать.

...