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

Поиск:

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


Новичок



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

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



Цитата

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

Давайте разберемся с этим вопросом подробней.
Да, я линкую с приложением и библиотеку, но не компилирую его в приложение.
Если не указать библиотеки линковщику - не находятся функции с библиотеки. А следовательно не проходит линковка. По этому, как мне кажется, я вынужден указывать проекту приложения пути к используемым динамическим библиотекам.
Цитата

что касается линковки - для этого есть "-L" и "-rpath".

я использовал эти ключи, как мне кажется , во всех вариациях - положительного результата не получал:
Цитата

-L[полный путь к директории с библиотекой (ПП)]
-L[относительный путь к директории с библиотекой (ОП)]
`-L[полный путь к директории с библиотекой]`
`-L[относительный путь к директории с библиотекой]`
-rpath=.
-Wl,-rpath=.
-rpath=[ПП]
-rpath=[ОП]
`-rpath=[ПП]`
`-rpath=[ОП]`


Признаю свою не грамотность в незнании, когда нужно использовать `, а когда нет.
Цитата

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

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

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


Опытный
**


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

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



Цитата(ivanstanislavovich @  9.9.2011,  11:45 Найти цитируемый пост)
Считаю не правильным использовать системные пути для указания мест хранения библиотек приложения.
Значит надо динамические либы положить в рабочую директорию 
Это работает не везде, под соляркой, например...

Или в системную директорию, /usr/lib и т.п.

Это сообщение отредактировал(а) Леопольд - 9.9.2011, 12:02


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
boostcoder
Дата 9.9.2011, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(ivanstanislavovich @  9.9.2011,  11:45 Найти цитируемый пост)
Да, я линкую с приложением и библиотеку, но не компилирую его в приложение.

это называется "приложение статически связанное с динамической библиотекой". т.е. библиотека-то динамическая. что позволяет вам заменять ее не пересобирая приложение, но без изменений экспортируемых сигнатур. другой способ - динамической связывание. реализуется при помощи dlopen() и dlsym(). в этом случае вам вовсе не нужно линковать библиотеку с приложением.

Цитата(ivanstanislavovich @  9.9.2011,  11:45 Найти цитируемый пост)
Считаю не правильным использовать системные пути для указания мест хранения библиотек приложения. К тому же уважаемый kemiisto предоставил ссылку, в которой объясняется почему этого делать не нужно, что совпадает с моим мнением.

это не системные пути. эта переменная используется только в user-space. выполните в терминале: echo $LD_LIBRARY_PATH
что видите? правильно, ничего. потому что вы эту переменную никак не установили.
в добавок, LD_LIBRARY_PATH относится только к экземпляру bash`а, или сессии пользователя(если вы ее пропишите в ~/.bashrc). т.е. ее значение никак не отражается на системе и ее переменных.

Добавлено через 1 минуту и 9 секунд
Цитата(Леопольд @  9.9.2011,  11:56 Найти цитируемый пост)
Это работает не везде, под соляркой, например

это и в линуксе не работает, например ;)
PM WWW   Вверх
Леопольд
Дата 9.9.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(boostcoder @  9.9.2011,  11:57 Найти цитируемый пост)
это и в линуксе не работает, например ;)
Разве? Вроде бы работало... Хотя может и путаю, надо удостовериться, но мне негде сейчас. Под виндой точно работает)

Это сообщение отредактировал(а) Леопольд - 9.9.2011, 12:03


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
boostcoder
Дата 9.9.2011, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



зато работает в венде. ибо поиск начинается именно с каталога в котором запущена программа.

ivanstanislavovich, кстати. почитайте еще про LD_PRELOAD.
PM WWW   Вверх
xvr
Дата 9.9.2011, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ivanstanislavovich @  9.9.2011,  00:07 Найти цитируемый пост)
Для линковщика задал дополнительные параметры:

Дайте полную строку линковки, как она записана у вас в файле.

Добавлено через 1 минуту и 40 секунд
PS. LD_LIBRARY_PATH действительно крайне не рекомендуется использовать для обычного запуска приложений, но для проверки, находятся .so или нет ее вполне можно задействовать

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


pattern`щик
****


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

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



Цитата(xvr @  9.9.2011,  12:04 Найти цитируемый пост)
 LD_LIBRARY_PATH действительно крайне не рекомендуется использовать для обычного запуска приложений

объективных причин для этого я не нашел.
PM WWW   Вверх
ivanstanislavovich
Дата 9.9.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



boostcoder, мне не нравится метод решения через $LD_LIBRARY_PATH. Выходит, для того что бы приложение работало, я должен прописывать пути к используемым библиотекам где-то на стороне. Но мне больше подходит решение, когда приложение самостоятельно ищет библиотеки в рабочей директории, как в Windows. Или это противоречит принципам Unix подобных ОС?
Насчет динамического и статического связывания - я более детально ознакомлюсь с динамическим связыванием и смогу общаться на эту тему. Но, как мне кажется, статическое связывание с динамической библиотекой, мне полностью подходит.
PM MAIL   Вверх
xvr
Дата 9.9.2011, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ivanstanislavovich @  9.9.2011,  12:09 Найти цитируемый пост)
boostcoder, мне не нравится метод решения через $LD_LIBRARY_PATH. Выходит, для того что бы приложение работало, я должен прописывать пути к используемым библиотекам где-то на стороне. 

Не обязательно. Приложение может запускаться через shell'овский скрипт, который выставит LD_LIBRARY_PATH во что надо и запустит что надо.

Цитата(ivanstanislavovich @  9.9.2011,  12:09 Найти цитируемый пост)
Или это противоречит принципам Unix подобных ОС?

В принципах 'Unix подобных ОС' делать shell'овские файлы по каждому поводу (и без повода)  smile 
PM MAIL   Вверх
ivanstanislavovich
Дата 9.9.2011, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



xvr, у меня нет рабочей комбинации, по этому я не знаю какую из них предоставить Вам. 
В одних случаях, я получаю ошибку "undefined reference" к используемым функциям в библиотеке. В других - cannot find -[имя библиотеки].so. Если задать Link libraries не имя, а путь к библиотеке - компиляция проходит успешно, но приложение не запускается, ни в отладке, ни самостоятельно из-за не правильного пути к библиотеке (описано выше)
Если подставить библиотеки по "горбатому" пути - приложение работает.

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


pattern`щик
****


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

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



Цитата(ivanstanislavovich @  9.9.2011,  12:09 Найти цитируемый пост)
Выходит, для того что бы приложение работало, я должен прописывать пути к используемым библиотекам где-то на стороне.

эм..
а так, не пробовали?
Цитата

user@user-pc:~$ LD_LIBRARY_PATH=/some/path ./exename exeargs


Цитата(ivanstanislavovich @  9.9.2011,  12:09 Найти цитируемый пост)
Или это противоречит принципам Unix подобных ОС?

угу. для библиотек есть стандартные каталоги "/lib, /usr/lib, /usr/local/lib"

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


Эксперт
****


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

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



Цитата(ivanstanislavovich @  9.9.2011,  12:17 Найти цитируемый пост)
xvr, у меня нет рабочей комбинации, по этому я не знаю какую из них предоставить Вам. 

Давайте все нерабочие

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


Новичок



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

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



xvr, хорошо:
Цитата

Код

-Wl,-rpath=.

cannot find -lLib.so|

Цитата

Код

-Wl,-rpath=../bin/Debug/

cannot find -lLib.so|

Цитата

Код

-L../bin/Debug

cannot find -lLib.so|

Цитата

Код

`-L../bin/Debug`

cannot find -lLib.so|

Цитата

Код

-L`../bin/Debug`

cannot find -lLib.so|

Цитата

Код

-L`/home/r/Документы/projects/tests/lib/bin`

/projects/tests/lib/consol/main.cpp|8|undefined reference to `lib::lib()'|


.................................................. пх-х-х

Добавлено через 4 минуты и 56 секунд
boostcoder, я пробую LD_LIBRARY_PATH, по Вашим рекомендациям

Код

r@r-VirtualBox:~$ LD_LIBRARY_PATH=/home/r/Документы/projects/tests/lib/bin
r@r-VirtualBox:~$ echo $LD_LIBRARY_PATH
/home/r/Документы/projects/tests/lib/bin

Но Code::Block по прежнему не находит библиотеку  (C::B перезапустил). В чем может быть причина ?
PM MAIL   Вверх
xvr
Дата 10.9.2011, 11:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ivanstanislavovich @  9.9.2011,  21:41 Найти цитируемый пост)
xvr, хорошо:

Последняя явно неправильно - обратные кавычки обозначают совсем другое 
Все первые ругались не на rpath а на ваш -l Видимо там было написан -lLib.so, это неправильно. При такой записи файл с библиотекой должен называться libLib.so.so 

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


Новичок



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

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



xvr, я не понял Вас.
Цитата

а на ваш -l Видимо там было написан -lLib.so, это неправильно

-l  о каком моем этаком Вы говорите?
там было написан  это где Это там ?

Имя моей библиотеки имело такие имена, я эксперементировал:
Цитата

liblib.so
lib.so
lb.so


во всех случаях я имел ошибку "cannot find", за исключением того, что если имя библиотеки было "liblib" то "cannot find -|lib.so" ошибку имел.

Не моглибы Вы, xvr, предоставить мне информацию о "`"?

Это сообщение отредактировал(а) ivanstanislavovich - 10.9.2011, 12:13
PM MAIL   Вверх
Страницы: (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.0931 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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