Russian Qt Forum

Qt => Общие вопросы => Тема начата: mokynis от Октябрь 04, 2010, 09:16



Название: проект и динамическая библиотека
Отправлено: mokynis от Октябрь 04, 2010, 09:16
пытаюсь по Шлее написать программку, которая бы использовала внешнюю библиотеку. Ничего не получается. Читал http://www.prog.org.ru/topic_8259_15.html (http://www.prog.org.ru/topic_8259_15.html) Там и библиотека, и сама программа собираются в рамках одного проекта. Я хочу, чтобы программа и библиотека были каждая сама по себе-2 отдельных проекта. Хоть как-то запустить удалось только из среды Qt Creator'а. При попытке запустить программку саму по себе, лается, что
Цитировать
error while loading shared libraries: libmyLib.so.1: cannot open shared object file: No such file or directory
Вот тут http://forum.vingrad.ru/forum/topic-307288.html (http://forum.vingrad.ru/forum/topic-307288.html) советуют изменить переменную среды, но не хочется засорять LIBRARY_PATH - мало ли где и каких библиотек пока учу я тут наклепаю. Как можно подцепить библиотеку, которая находится ну, хотя бы там же, где и запускается ее использующая программа? Свой опус прилагаю


Название: Re: проект и динамическая библиотека
Отправлено: kuzulis от Октябрь 04, 2010, 09:31
1. Для тестирования в процессе разработки можно довольствоваться LIBRARY_PATH
2. Но, когда уже все перепроверено и оттестировано - то нужно создать под конкретный дистр линукса "инсталляционный" пакет с вашей программой, который бы включал: сам бинарь приложения + бинарь/бинари разделяемой библиотеки + другие необходимые файлы (которые Вы считаете необходимыми). При этом после установки вашего пакета бинарики автоматом установятся в /usr/bin, библиотеки в /usr/lib, остальные файлы или в /etc или еще куда. Хотя пути установки будут зависеть от типа используемого дистрибутива.
3. Чтобы сделать универсальную "инсталляшку" (с условием, что ваша программка будет лежать в какой-то одной директории и содержать бинарики и библиотеки в этой директории <ну или в нескольких поддиректориях вашей директории>) вы должны, например,  создать скрипт в котором бы было прописано LIBRARY_PATH (т.е. аналогично п.1.) и другие сопусттвующие данные. И теперь, для того чтобы запустить вашу программу нужно запустить скрипт, который все сделает сам.

Как то так.

Я бы сделал п.2.

И да, п.4 : можно спроектировать приложение так, чтобы разделяемая библиотека загружалась динамически в процессе работы вашей программы (т.е. в этом случае программа не линкуется с библиотекой). При этом ваша программа должна содержать какой-то конфигурационный файл в котором был бы указан путь к директории с библиотеками и т.п.. И при своем запуске она читала бы конфиг и подгружала искомую библиотеку.

По какому пути Вам идти - решать Вам.

ЗЫ:
1. тема не относится к Qt в принципе.
2. мусолилать уже стопиццот раз.


Название: Re: проект и динамическая библиотека
Отправлено: SASA от Октябрь 04, 2010, 10:35
По поводу пункта 3 можно подсмотреть как это делает КуТэ Кретор.


Название: Re: проект и динамическая библиотека
Отправлено: mokynis от Октябрь 04, 2010, 14:25
to kuzulis
а можно поподробней про 4 пункт? Кажется, это как раз то, что хотелось. Путь я и в самой программе пропишу если что... Главное принцип-что сделать чтобы без лишнего мусора в самой системе воспользоваться библиотекой. Ну не хочу я забивать свой Linux своим же мусором


Название: Re: проект и динамическая библиотека
Отправлено: kuzulis от Октябрь 04, 2010, 14:36
Цитировать
to kuzulis
а можно поподробней про 4 пункт? Кажется, это как раз то, что хотелось. Путь я и в самой программе пропишу если что... Главное принцип-что сделать чтобы без лишнего мусора в самой системе воспользоваться библиотекой. Ну не хочу я забивать свой Linux своим же мусором
Тогда используй :
1. ИЛИ QPluginLoader, он как раз для этого и предназначен. Это если в том случае если твоей библиотекой будет пользоваться только твое приложение или другие приложения написаные на Qt4.

2. ИЛИ QLibrary, но в этом случае придется немножко подшаманить с исходниками твоей библиотеки в части макросов EXPORT/IMPORT.
Описание как это сделать есть в ассистенте.
И тогда ею могут пользоваться любые приложения (например написанные на чистом С/С++ и т.п.)

Все зависит от того что тебе нужно. Читай, разбирайся.  :)
---