Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно подлючить библиотеку? Пути во время отладки верны, а так-нет 
V
    Опции темы
ivanstanislavovich
  Дата 1.9.2011, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.8.2007
Где: Укр.Кривой Рог

Репутация: нет
Всего: нет



Приветствую. 

Когда подключаю библиотеки с относительным путем (../bin/debug), то во время отладки они находятся. Но когда исполняемый файл выполнить без нее (простой запуск), то библиотеки уже не находятся (в корне директории эти файлы есть), т.к. их нет по указанному пути, относительно исполняемого файла.

Библиотеки динамические (подключаемые во время выполнения программы)
Способ подключения библиотек 1 (не рабочий)
  • 1. Относительный путь к библиотеке.
Способ подключения библиотек 2 (не рабочий, не находит библиотеки)
  • 1. Имя библиотеки;
  • 2. Для линковщика задается путь поиска библиотек.
Использую:
OS: Ubuntu
IDE: CodeBlock
Lang: C++

Добавлено через 10 минут и 30 секунд
Структура каталогов проекта:
bin
    debug (для всех нижеследующих проектов)
Project1
Project2
PM MAIL   Вверх
newbee
Дата 1.9.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Добавь ключ компилятора -Wl,-rpath,.


--------------------
You're face to face
With man who sold the world
PM   Вверх
ivanstanislavovich
Дата 1.9.2011, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.8.2007
Где: Укр.Кривой Рог

Репутация: нет
Всего: нет



Цитата(newbee @ 1.9.2011,  18:47)
Добавь ключ компилятора -Wl,-rpath,.

я пробовал это значение указать в:
  • Other Compiler options
  • Other linker options
Но без результатов
PM MAIL   Вверх
newbee
Дата 1.9.2011, 19:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Кхм. Попробуй в Other linker options вбить
Код

-rpath .
 Если не сработает, значит что-то ты не так объяснил или я что-то не так поняла.


--------------------
You're face to face
With man who sold the world
PM   Вверх
ivanstanislavovich
Дата 1.9.2011, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.8.2007
Где: Укр.Кривой Рог

Репутация: нет
Всего: нет



Цитата(newbee @  1.9.2011,  19:18 Найти цитируемый пост)
-rpath 

Спасибо за оказание помощи.
Я попробовал "-rpath .", но все так же без результатов.

Попробую объясниться иначе:
У меня два проекта. Один - динамическая библиотека, другой - консольное приложение. Оба проекта компилируют в одну директорию (относительно каждого из них, это ../bin/debug). Линковщику указую относительный путь к библиотеке (которая лежит в общем каталоге). Программа компилируется успешно, линкуется тоже. 
Но вот запуск прерывается из-за отсутствующей библиотеке по адресу "../bin/debug/lib.so", т.е. пути, который я задавал линковщику, относительно расположения файла проекта. 
Изменение адреса на имя для библиотеки, для линковщика, и добавление путей поиска (Search Directories -> Linker) все равно не дало возможности скомпилировать проект приложения - не находит библиотеки.

Это сообщение отредактировал(а) ivanstanislavovich - 1.9.2011, 19:38
PM MAIL   Вверх
ivanstanislavovich
Дата 1.9.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.8.2007
Где: Укр.Кривой Рог

Репутация: нет
Всего: нет



Цитата(newbee @  1.9.2011,  19:18 Найти цитируемый пост)
-rpath .

Думаю это важно "-rpath ." не сработал, говорит, что не верный файл "."
Я убрал пробел и получил "-rpath." и проект скомпилировался.
PM MAIL   Вверх
xvr
Дата 2.9.2011, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Пропишите в переменную окружения LD_LIBRARY_PATH абсолютный путь к вашей .so до запуска самого приложения. Вариант с rpath тоже вполне рабочий, особенно если .so будет лежать в какой то фиксированной директории (лучше прямо из корня), иначе будут пляски с путями, если вы захотите перенести ваш исполняемый файл в другое место.

Или можно записать в rpath специальный символ:
Цитата

       ld.so understands the string $ORIGIN (or equivalently ${ORIGIN}) in an rpath specification (DT_RPATH or DT_RUNPATH) to mean the  directory  containing  the application executable.  Thus, an application located in somedir/app could be compiled with gcc -Wl,-rpath,'$ORIGIN/../lib' so that it finds an associated shared library in somedir/lib no matter where somedir is located in the directory hierarchy.
       This  facilitates the creation of "turn-key" applications that do not need to be installed into special directories, but can instead be
       unpacked into any directory and still find their own shared libraries.
 
PM MAIL   Вверх
ivanstanislavovich
Дата 9.9.2011, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.8.2007
Где: Укр.Кривой Рог

Репутация: нет
Всего: нет



xvr, спасибо за помощь. 
Но у меня не получилось.

Библиотеку скомпилировал в ту же директорию, что и приложение. 
Для приложения указал директорию поиска для линковщика - директорию в которой лежит библиотека (относительный путь), т.е. та же директория, что и для скомпилированного приложения.
Для линковщика указал относительные пути к библиотекам
Для линковщика задал дополнительные параметры: 
Код

-Wl,-rpath=.
-Wl,-rpath=$ORIGIN/
-lpthread
-ldl

1-й и 2-й (по отдельности для разных компиляций) по вашим рекомендациям, для разрешения вопроса
последние два, для разрешения других ошибок, связанных с ошибками:
Цитата

undefined reference to `pthread_mutex_trylock'

и 
Цитата

undefined reference to `dlsym'


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

xvr, Вы говорили 
Цитата

Пропишите в переменную окружения LD_LIBRARY_PATH абсолютный путь к вашей .so до запуска самого приложения. 

т.е. в это системная переменная ? Если так, то я этот способ пока не испытывал. Но я бы не хотел прибегать к решению проблемы таким вот способом. 
PM MAIL   Вверх
ivanstanislavovich
Дата 9.9.2011, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.8.2007
Где: Укр.Кривой Рог

Репутация: нет
Всего: нет



тут я нашел похоже решение. Но я не могу понять, что означает 
Цитата

4. add TestDll (without the lib and the .so) to the exe's link-libraries,

т.е. как-то добавить библиотеку, но не добавлять .so и некий lib. Что добавлять, и что такое lib (расширение файла?)
PM MAIL   Вверх
kemiisto
Дата 9.9.2011, 09:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 2
Всего: 160



Цитата(xvr @  2.9.2011,  10:50 Найти цитируемый пост)
Пропишите в переменную окружения LD_LIBRARY_PATH абсолютный путь к вашей .so до запуска самого приложения.

Читать.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
ivanstanislavovich
Дата 9.9.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.8.2007
Где: Укр.Кривой Рог

Репутация: нет
Всего: нет



Народ, а почему не работает "Search directories" для Linker:
Когда задаю только имя .so линковщик не находит библиотеку, хотя в директории поиска указан каталог, в котором есть эта библиотека?

PM MAIL   Вверх
ivanstanislavovich
Дата 9.9.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.8.2007
Где: Укр.Кривой Рог

Репутация: нет
Всего: нет



Неужели никто не работает с динамическими библиотеками?! Как они у Вас подключаются?!
PM MAIL   Вверх
boostcoder
Дата 9.9.2011, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



во первых - почему тема в общем разделе?
во вторых - ivanstanislavovich, в топике вы написали: Библиотеки динамические (подключаемые во время выполнения программы). так а зачем вы их тогда линкуете с приложением? используйте dlopen(), dlsym().
в третьих - это:
Цитата(ivanstanislavovich @  9.9.2011,  00:07 Найти цитируемый пост)
undefined reference to `pthread_mutex_trylock'

и это:
Цитата(ivanstanislavovich @  9.9.2011,  00:07 Найти цитируемый пост)
undefined reference to `dlsym'

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

Добавлено через 3 минуты и 37 секунд
перечитал, и вроде как понял, что у вас проблема с тем, что исполняемый файл не находит .so`шки которые лежат в только вам известном "месте"(хм.. звучит-то как smile ).
уже написали, это решается при помощи LD_LIBRARY_PATH.

Добавлено через 13 минут и 8 секунд
Цитата(ivanstanislavovich @  9.9.2011,  10:23 Найти цитируемый пост)
Неужели никто не работает с динамическими библиотеками?

работаю.

Цитата(ivanstanislavovich @  9.9.2011,  10:23 Найти цитируемый пост)
Как они у Вас подключаются?

dlopen(), dlsym().
PM WWW   Вверх
ivanstanislavovich
Дата 9.9.2011, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 16.8.2007
Где: Укр.Кривой Рог

Репутация: нет
Всего: нет



boostcoder, Спасибо за ответ

По Вашим вопросам:
Цитата

во первых - почему тема в общем разделе?

Перечитав предложенные группы тем я пришел к такому выводу. А по Вашему, где должна находится тема?
Цитата

так а зачем вы их тогда линкуете с приложением?

Мне кажется, что все это время я как раз пытался уйти от компиляции библиотек в приложении.
Цитата

используйте dlopen(), dlsym().

Ознакомлюсь, мне нужно время что бы понять, о чем Вы говорите.
Цитата

из-за того, что вы указываете не те пути для этих библиотек.

Я как раз и пытаюсь указать пути к библиотекам так, что бы приложение работало как в отладке, так и самостоятельно. Буду благодарен, если, наконец, этот вопрос разрешится.

Цитата

в четвертых - в чем все же у вас вопрос?

Вопрос в том, что у меня имеется динамическая библиотека, которую я хочу подключить к приложению. Оба проекта (библиотека и приложения) компилируются в общую директорию (../bin/Debug, относительно обоих проектов). Испробовав множество различных способов, я получаю не верные ссылку к библиотеке на этапе линковки, или запуска приложения в режиме отладки, или самостоятельного запуска приложения. Искомый путь библиотек, при успешной компиляции и линковки приложения "../bin/Debug", относительно исполняемого файла, а мне необходимо получить "./", относительно исполняемого файла. 
Цитата

уже написали, это решается при помощи LD_LIBRARY_PATH.

Мне бы не хотелось использовать данный способ разрешения вопроса.

PM MAIL   Вверх
boostcoder
Дата 9.9.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(ivanstanislavovich @  9.9.2011,  11:19 Найти цитируемый пост)
А по Вашему, где должна находится тема?

тут: C/C++: Программирование под Unix/Linux
но ладно. оставьте. модеры перенесут если что.

Цитата(ivanstanislavovich @  9.9.2011,  11:19 Найти цитируемый пост)
Мне кажется

вам кажется? smile 

Цитата(ivanstanislavovich @  9.9.2011,  11:19 Найти цитируемый пост)
Вопрос в том, что у меня имеется динамическая библиотека, которую я хочу подключить к приложению. Оба проекта (библиотека и приложения) компилируются в общую директорию (../bin/Debug, относительно обоих проектов). Испробовав множество различных способов, я получаю не верные ссылку к библиотеке на этапе линковки, или запуска приложения в режиме отладки, или самостоятельного запуска приложения. Искомый путь библиотек, при успешной компиляции и линковки приложения "../bin/Debug", относительно исполняемого файла, а мне необходимо получить "./", относительно исполняемого файла.

что касается линковки - для этого есть "-L" и "-rpath".
что касается поиска библиотеки при запуске - уже написали несколько раз - LD_LIBRARY_PATH. именно для подобных случаев она и предоставлена пользователю.

Цитата(ivanstanislavovich @  9.9.2011,  11:19 Найти цитируемый пост)
Мне бы не хотелось использовать данный способ разрешения вопроса.

позвольте узнать о причинах?

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


Это сообщение отредактировал(а) boostcoder - 9.9.2011, 11:33
PM WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1106 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.