2010-07-26 2 views
0

Я следую учебнику по кулинарной книге C++ по связям статической и динамической библиотек с g ++. Я могу построить двоичный штраф, но когда я запускаю его я получаю ошибкуg ++ 4.4 "ошибка при загрузке разделяемых библиотек"

./hellobeatles: ошибка при загрузке разделяемых библиотек: libjohnpaul.so: не удается открыть общий объектный файл: Нет такого файла или каталога

I используется команда : г ++ -o hellobeatles hellobeatles.cpp -L ../johnpaul/ -L ../georgeringo/ -ljohnpaul -lgeorgeringo

программа строит и работает нормально, если я явно указать путь, как : г ++ -o hellobeatles hellobeatles.cpp ../johnpaul/libjohnpaul.so ../georgeringo/libgeorgeringo.so

Я неправильно ссылаюсь на библиотеки в первой команде? Или есть какая-то конфигурация, с которой мне нужно гасить?

Я использую Ubuntu 9.10 guest vm в VirtualBox, если это имеет значение, и вот -v Использование встроенных спецификаций. Цель: x86_64-linux-gnu Конфигурировано с помощью: ../src/configure -v --with-pkgversion = 'Ubuntu 4.4.1-4ubuntu9' --with-bugurl = file: /// usr/share/doc /gcc-4.4/README.Bugs --enable-languages ​​= c, C++, fortran, objc, obj-C++ --prefix =/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir =/usr/lib --without-included-gettext --enable-threads = posix --with-gxx-include-dir =/usr/include/C++/4.4 --program -suffix = -4.4 --enable-nls --enable-clocale = gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32 = i486 --with-tune = generic --enable-checking = release --build = x86_64-linux-gnu --host = x86_64-linux-gnu --target = x86_64-linux-gnu Модель темы: posix gcc версия 4.4.1 (Ubuntu 4.4 .1-4ubuntu9)

ответ

2

Динамический компоновщик e чтобы найти разделяемые библиотеки в /usr/lib, /lib, /usr/local/lib и, возможно, в нескольких других местах. Это, безусловно, не искать их в ../johnpaul/.

Если библиотеки предназначены для установки в глобальном местоположении, просто установите их там.

В противном случае вы должны сообщить динамическому компоновщику, где их найти.

Лучший подход заключается в добавлении их к RPATH закодированного в исполняемый файл:

g++ -o hellobeatles hellobeatles.cpp \ 
    -L ../johnpaul/ -L ../georgeringo/ -ljohnpaul -lgeorgeringo \ 
    -Wl,-rpath=/path/to/johnpaul:/path/to/georgeringo 

Альтернативное (и менее предпочтительно) подход заключается в следующем:

export LD_LIBRARY_PATH=/path/to/johnpaul:/path/to/georgeringo 
Смежные вопросы