Модераторы: 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   Вверх
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   Вверх
boostcoder
Дата 10.9.2011, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(ivanstanislavovich @  10.9.2011,  12:13 Найти цитируемый пост)
во всех случаях я имел ошибку "cannot find"

если ваша библиотека зовется liblib.so, то опцию нужно указывать так: -llib
если бы ваша библиотека звалась libmy.so, то опцию нужно указывать так: -lmy

Добавлено @ 12:25
т.е. вне зависимости от типа библиотеки(.a/.so) расширение указывать не нужно.
второе - библиотеки должны иметь префикс "lib". но при указании их линковщику, префикс указывать не нужно.

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


Новичок



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

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



xvr
boostcoder
Спасибо Вам! Примного благодарен. Вашими советами!

Выходит так, нужно делать:
библиотеку называть с префиксом lib, но обращаться к ней без него, и без расширения (so, a). 
я же совершал сразу все ошибки, по не знанию
еще нужно в опциях линковщику задать "-Wl,-rpath=.", для того, что бы приложение искало библиотеки в своем корневом каталоге.

Недели возни и все из-за таких мелочей. Почему этого нет в мануалах? Я там находил как подключать библиотеки, но таких нюансов не было

Добавлено через 1 минуту и 13 секунд
newbee
kemiisto
Леопольд
Так же спасибо!
PM MAIL   Вверх
boostcoder
Дата 10.9.2011, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(ivanstanislavovich @  10.9.2011,  12:41 Найти цитируемый пост)
Почему этого нет в мануалах?

эм.. не помню что там есть... давно не читал.
PM WWW   Вверх
kemiisto
Дата 10.9.2011, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Цитата(ivanstanislavovich @  10.9.2011,  11:41 Найти цитируемый пост)
Недели возни и все из-за таких мелочей.

Это не мелочи. Это ублюдочно-тошнорвотная сишечная модель компиляции-линковки из прошлого тысячелетия.

Цитата(ivanstanislavovich @  10.9.2011,  11:41 Найти цитируемый пост)
Почему этого нет в мануалах?

Есть. А то откуда же люди знают?


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


Эксперт
****


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

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



Цитата(ivanstanislavovich @  10.9.2011,  12:13 Найти цитируемый пост)
xvr, я не понял Вас.

Дайте полную командную строку линковки. Очень трудно догадаться что там не так не видя этого самого 'там'  smile 

Цитата(ivanstanislavovich @  10.9.2011,  12:13 Найти цитируемый пост)
Не моглибы Вы, xvr, предоставить мне информацию о "`"?

Это стандартная фича шела (да и make'а тоже). Строка внутри `` трактуется как команда, которая выполняется. То, что она выведет в стандартный поток вывода и будет использовано вместо всей конструкции ``
Например -
Код

ls -l `which g++`
найдет g++ на путях поиска и выведет полную информацию о файле
У меня (под cygwin'ом) это дает
Цитата

lrwxrwxrwx 1 Roman root 21 Apr 14 23:25 /usr/bin/g++ -> /etc/alternatives/g++

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


Новичок



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

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



xvr, Спасибо Вам. Не беспокойтесь более об этом - вопрос уже разрешен. И спасибо за информацию о "`"
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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