g ++ 4.4 "Ошибка при загрузке общих библиотек" - PullRequest
0 голосов
/ 26 июля 2010

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

. / Hellobeatles: ошибка при загрузке общих библиотек: libjohnpaul.so: невозможно открыть файл общих объектов: такого файла или каталога нет

Я использовал команду : g ++ -o hellobeatles hellobeatles.cpp -L ../johnpaul/ -L ../georgeringo/ -ljohnpaul -lgeorgeringo

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

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

Я запускаю гостевую виртуальную машину Ubuntu 9.10 в 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 - без включенного-gettext --enable-threads = posix --with-gxx-include-dir = / usr / include / c ++ / 4.4 --program-суффикс = -4.4 --enable- nls --enable-clocale = gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32 = i486 --with-tune = универсальный --enable-check = 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)

1 Ответ

2 голосов
/ 28 июля 2010

Динамический компоновщик ожидает найти общие библиотеки в /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
...