LINUX.ORG.RU

Не запускается приложение

 , ,


0

1

Собрал кросс-компилятором arm-linux-gnueabihf-* приложение под виндой. выгрузил на цельевую машину - запустил «холоворд», работает. Дописал свой код, собрал, выгрузил, запускаю - получаю ошибку

pi@raspberrypi:~/myProg $ ./myProg ./myProg : /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./myProg )

Как решить проблему? Запускать программу придёться на многих машинах. Желательно чтобы на цельевых машинах бубном не стучать. Либо статически как-то собрать, а лучше рядом с myProg положить недостающую библиотеку, чтоб при обновлении маленькую myProg обновить.


Это не фатальная ошибка.

Подготовь свой бинарник особым образом. Скачай мою сборку GCC (я собирал под 32-бит Rasperry Pi 3 - на 2 не запустится, так как, перед компиляцией, я указал модель процессора). https://yadi.sk/d/QUjNLTCx3Koo7o В директории lib лежит файл libstdc++.so.6. Это симлинк на файл libstdc++.so.6.0.20. Возьми их оба, и скопируй в директорию с программой. Запусти программу так:

LD_LIBRARY_PATH=. ./MyProg

Должно работать.

Это была только проверка. Теперь нам надо создать директорию lib в директории с твоей программой, чтобы затем перенести файл библиотеки в неё. Так красивее, эстетичнее. А затем создать скрипт, подцепляющий эту директорию при запуске программы.

Собственно, вот скрипт:

#!/bin/sh

LD_LIBRARY_PATH=./lib ./MyProg

Всё. Но можно сделать более круто.

#!/bin/sh

# Change to app directory
CANONPATH=`readlink -f "$0"`
cd "`dirname "$CANONPATH"`

# Define variables
LIBS=./lib
BIN=./MyProg

# Run the app:
export LD_LIBRARY_PATH=$LIBS:"$LD_LIBRARY_PATH"
$BIN $@

exit $e

Запускать так: ./laucher.sh. Если к файлу не применён бит исполняемости, то не запустится. Из LXDE его можно включить при помощи файлового менеджера, в свойствах файла. Из консоли так: chmod +x launcher.sh. А можно обойтись и без бита исполняемости: sh laucher.sh

Кстати. В директорию lib можно положить любую библиотеку-зависимость, а не только libstdc++. Это бывает полезно, если не хочется использовать статичную линковку. Допустим, наша программа зависит от OpenSSL. А эта библиотека, как Флеш Плеер, каждые несколько недель обновляется, чтобы исправить очередную критичную уязвимость. И если уж понадобилось положить эту библиотеку вместе с программой (например, приложение хочет версию 1.0.2, а в системе только 1.0, не совместимая с ней), то динамическая линковка позволяет в любой момент обновить эту библиотеку.

Я сегодня когда-нибудь остановлюсь писать, или нет? В игре World of Goo, а также в ещё многих играх, портированные на Linux программистом под псевдонимом Icculus, в директории с игрой лежит не только libstdc++, но и libgcc_s. Не знаю зачем это надо, ведь и без второй библиотеки всё работает. Но Icculus умнее меня, и поэтому я предлагаю положить вместе с дистрибутивом программы и эту библиотеку тоже.

Если у тебя Raspbian Linux 2, как и у меня, то я советую тебе скачать мою сборку GCC 6 по этой ссылке: Я тут вам GCC 6 для Raspbian 8 принёс А если у тебя Raspbian 3, то GCC 6 там и так есть. Стоп, выше же я уже давал эту ссылку? Мне пора спать.

ZenitharChampion ★★★★★
()
Последнее исправление: ZenitharChampion (всего исправлений: 4)

«Подцепить» файл библиотеки можно и без скрипта. Только я не знаю зачем. Но если надо, то я скажу как.

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

Берёшь клавиатуру, кладёшь на стул, садишься несколько раз. Потом прогоняешь spell checher до тех пор, пока все ошибки не будут исправлены. Так и пишу.

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

Спасибо за развернутый ответ. Скачал вашу сборку gcc. Во первых где там исполняемые файлы *.exe? Я собираю под виндой. В самом начале писал, что пишу под виндой. Во вторых у меня цельевые и распбери 2 и 3.

Я скачал gcc 6.3.0 для винды вот тут http://gnutoolchains.com/raspberry/ В этом тулчейне нашел либы, дальше сделал как вы писали - программа вроде запустилась. Но!!!

На рабочем компе пишу прогу в IDE Eclipse. Поднял отладку. Хеловорд отлаживатеся нормально.... Eclipse запускает сервер gdb на распбери и под gdb отлаживается моя прога (холоворд). Дописал код, теперь моей проге требуется библы. руками могу запустить прогу, но эклипс не знает, что нужно LD_LIBRARY_PATH, да и как это в гдб-сервер переслать?

Может в эклипсе сделать дебажную сборку, в которой бинарник соберётся со статическими либами? А для релиза делать динамическую сборку? Это решит проблему? Как сделать статическую сборку (в Эклипсе)?

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

Я про тебя совсем забыл.

Ты, вероятно, совсем не работал в Linux. Поясню. Ты видел как в папке с программой для Windows лежит файл MSVCP60.DLL? Или 80, или 100, или 120? Этот DLL называется C++ Runtime. Не у всех пользователей он - самый новый. Поэтому авторы программ часто кладут этот файл библиотеки вместе со своей программой, и так распространяют.

Я предлагаю сделать то же. C++ Runtime в Linux называется «libstdc++.so.6», где «so» - то же самое, что и DLL.

Собственно, инструкцию я тебе уже дал выше. Скачай мой архив с GCC для архитектуры ARM 32-bit. В папке lib лежит тот самый файл libstdc++.so.6. Положи его в директорию с твоей программой. И попробуй запустить:

LD_LIBRARY_PATH=. ./AppName
ZenitharChampion ★★★★★
()
Ответ на: комментарий от juvf

> На рабочем компе пишу прогу в IDE Eclipse. Поднял отладку. Хеловорд отлаживатеся нормально.... Eclipse запускает сервер gdb на распбери и под gdb отлаживается моя прога (холоворд). Дописал код, теперь моей проге требуется библы. руками могу запустить прогу, но эклипс не знает, что нужно LD_LIBRARY_PATH, да и как это в гдб-сервер переслать?

Как вариант, можно заменить libstdc++.so.6 для всей операционной системе. В папке /usr/lib (аналог C:\WINDOWS\System32\). Я вот только не помню, где именно в /usr/lib лежит этот файл библиотеки (а может вообще в /lib)

ZenitharChampion ★★★★★
()
Последнее исправление: ZenitharChampion (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.