LINUX.ORG.RU

gconf/QTCreator/static-dynamic lib linking


0

1

Недавно начал осваивать QT под Linux. Возник небольшой вопрос...

У меня есть скомпилированная статическая библиотека. Библиотека содержит в себе необходимый функционал для работы с gconf. Консольные приложения скопилированные в Netbeans с использованием указанной библиотеки успешно запускаются и отрабатывают, если в настройках проекта прописан путь к библиотекам *.so и указаны названия библиотек.

Необходимо использовать данную статическую библиотеку в проекте выполненом на QTCreator. Я добавил в файл test.pro строчки:


LIBS += /home/xray/LibraryLoader/liblibraryloader.a -ldl \
/usr/lib/libgconf2-4/2/libgconfbackend-evoldap.so  \
/usr/lib/libgconf2-4/2/libgconfbackend-oldxml.so \
/usr/lib/libgconf2-4/2/libgconfbackend-xml.so

Помимо этого, добавил в настройках проекта переменную LD_LIBRARY_PATH=/usr/lib/libgconf2-4/2/ . Без этого действия при запуске программы в отладчике появлялось сообщение


/home/xray/testLibs-build-desktop/testLibs: error while loading shared libraries: libgconfbackend-evoldap.so: cannot open shared object file: No such file or directory

Теперь, запуская debug, программа начинает работать, но останавливается на строчке в статической библиотеке liblibraryloader.a. Строчка: g_type_init(); // инициализация api gconf Похоже, что таки не удалось получить тело функции g_type_init() из указанных *.so. В консоли следующий вывод:


Starting /home/xray/testLibs-build-desktop/testLibs...
*** glibc detected *** /home/xray/testLibs-build-desktop/testLibs: malloc(): memory corruption: 0x09ab7900 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c501)[0x903501]
/lib/libc.so.6(+0x6f2fc)[0x9062fc]
...
...
b76fe000-b7705000 r--s 00000000 08:07 6393       /usr/lib/gconv/gconv-modules.cache
b7705000-b7706000 r--p 002a1000 08:07 7283       /usr/lib/locale/locale-archive
b7706000-b7708000 rw-p 00000000 00:00 0 
bf7fc000-bf81d000 rw-p 00000000 00:00 0          [stack]
The program has unexpectedly finished.
/home/xray/testLibs-build-desktop/testLibs exited with code 0

Буду признателен любым полезным советам.


Ответ на: комментарий от ikseg

А зачем проге на Qt gconf? Там же есть QSettings или это какое-то хитрое колдунство над настройками чего-то не своего?

anonymous
()
Ответ на: комментарий от anonymous

Для чего всё это затеивалось...

Для работы с ADC платами сбора данных был построен свой SDK. Множество динамических библиотек, которые выполняют функции управления платами, обработки сигналов, сохранения данных, отрисовки и т.д.

Рассмотрим группу динамических библиотек ответственных за работу с устройством. Каждая отдельная библиотека в данной группе позволяет работать только с определённой моделью устройства. Принцип работы для всех устройств одинаковый. В связи с этим, было решено сделать общий интерфейс для всех плат. Собственно в каждой библиотеке содержится класс с соотвесвующим для данной группы интерфейсом. Для того, чтобы удобно загружать библиотеку из любой разрабатываемой программы, нужно было реализовать загрузчик, который знал бы где располагаются все установленные библиотеки и какие интерфейсы они используют. Данную информацию хорошо бы локализовать в какой-то удобной для управления базе.

Почитав на форумах про аналоги реестра форточек, пришёл к выводу, что хорошим подспорьем может выступить gconf. Загрузчик был реализован. Весь код загнал в статическую либу, чтобы при создании новых проектов не думать о прописывании кучи путей к используемым хедерам.

ikseg
() автор топика

1. qtcreator - сожги это убожество и возьми лучше kate/gedit какой-нибудь.

2. Попробуй так

LIBS += -llibraryloader \
     -L/home/xray/LibraryLoader \
     -L/usr/lib/libgconf2-4/2 \
     -ldl
nanoo_linux
()

> Буду признателен любым полезным советам.
Не мешать в кучу Qt и GLib/GConf.

PayableOnDeath
()
Ответ на: комментарий от nanoo_linux

> qtcreator - сожги это убожество и возьми лучше kate/gedit какой-нибудь.
OMG. Назвать IDE убожеством, после чего предложить на замену текстовый редактор - такого я еще не видел.

PayableOnDeath
()
Ответ на: комментарий от ikseg

>Почитав на форумах про аналоги реестра форточек, пришёл к выводу, что хорошим подспорьем может выступить gconf.

С Qt это никто не использует… Используй встроенный QSettings, и никаких лишних проблем.

// Про сборку статики таки не скажу, никогда этого не делаю (^ ^)

Deleted
()

>*** glibc detected *** /home/xray/testLibs-build-desktop/testLibs: malloc(): memory corruption: 0x09ab7900 ***

А это точно проблема со сборкой, а не изредка проявляющийся баг? Если прогнать valgrind'ом релизную версию, то всё нормально?

Yareg ★★★
()
Ответ на: комментарий от Yareg

>Если прогнать valgrind'ом релизную версию, то всё нормально?

А, оно вообще не работает. Мне показалось, что написано, что релиз работает, а дебаг нет.

Yareg ★★★
()
Ответ на: комментарий от Yareg

Да, сделал динамическую сборку и проблема была решена. Спасибо. :)

Ещё один дилетантский вопрос: как задать в приложении пути поиска динамических библиотек по умолчанию? (хотелось бы, чтобы был путь /lib/libgconf2-4/2/)

Я задавал переменную в QTCreator LD_LIBRARY_PATH=/usr/lib/libgconf2-4/2/ и во время выполнения программы посредством запуска из этой IDE всё отлично работает. Если попытаться запустить приложение отдельно, то в консоль бросается знакомая строчка

error while loading shared libraries: libgconfbackend-evoldap.so: cannot open shared object file: No such file or directory
ikseg
() автор топика
Ответ на: комментарий от nanoo_linux

По большому счёту от qtcreator нужен только удобный отладчик... или есть что-то более приятное в Linux?

Я недавно стал переносить проекты из форточек, поэтому на начальном этапе портирования отсутствие Visual Studio на мне сильно сказывалось. :)

ikseg
() автор топика

>Помимо этого, добавил в настройках проекта переменную LD_LIBRARY_PATH=/usr/lib/libgconf2-4/2/

Логично, иначе нужно включить добавление rpath

Ну и вообще в LIBS лучше исполльзовать -L -l синтаксис, это портабельно

annulen ★★★★★
()
Ответ на: комментарий от Deleted

>Используй встроенный QSettings, и никаких лишних проблем.

Кстати, к QSettingsможно написать свой бэкэнд и складывать настройки хоть в xml-файл, хоть в мускуль

annulen ★★★★★
()
Ответ на: комментарий от annulen

> Ну и вообще в LIBS лучше исполльзовать -L -l синтаксис, это портабельно

Согласен, но почему-то qtcreator признаёт только пути вида

/usr/lib/libgconf2-4/2/libgconfbackend-evoldap.so

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

ikseg
() автор топика
Ответ на: комментарий от ikseg

Забудбьте про «qtcreator». Система сборки - qmake

annulen ★★★★★
()
Ответ на: комментарий от annulen

> Мб неправильно используете -L -l.

Специально попробовал вариант предложенный nanoo_linux выше. Не работает. :)

Мб лучше юзать pkg-config

Как раз собирался изучить эту тему. Я только вошёл в этот занимательный мир программирования под Linux, поэтому приходится отвыкать от привитой форточками лени.)

ikseg
() автор топика
Ответ на: комментарий от ikseg

если дейстовать по-форточному, можно собрать все зависимости в своем проекте:)

annulen ★★★★★
()
Ответ на: комментарий от ikseg

>По большому счёту от qtcreator нужен только удобный отладчик... или есть что-то более приятное в Linux?

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

annulen ★★★★★
()
Ответ на: комментарий от annulen

> Среды разработки есть разные, другое дело, что creator лучше заточен под Qt и связанные с Qt модные тренды

С точки зрения кросплатформенной разработки, QT - правильный выбор? или же стоило пользоваться чем-то другим?

ikseg
() автор топика
Ответ на: комментарий от annulen

> если на С++, то конечно правильный.

тогда, всё идёт по плану :)

ikseg
() автор топика
Ответ на: комментарий от ikseg

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

Согласно идеологии этим приложение заниматся не должно. use ld.so luke! Есть какой-то трюк с rpath, который все советуют, но это вроде костыля. Канонически верный путь - скопировать все so в /usr/local/lib. Если же такие библиотеки уже в системе есть, тогда надо необходимые либы скопировать в «надежное место» и написать скриптик <appname>.sh с таким содержанием и положить рядом с бинарником.

#!/bin/bash
env LD_LIBRARY_PATH=<путь к надёжному месту> ./app

и его стартовать. все проприетарщики так делают. Xilinx точно так делает.

nanoo_linux
()
Ответ на: комментарий от nanoo_linux

qtcreator раньше в выхлопе писал чего он там запускает для компиляции. Посмотрите что не так с опциями -l -L. Если уже не пишет - запусти в консоли make clean && make в папке с профайлом.

nanoo_linux
()
Ответ на: комментарий от nanoo_linux

nanoo_linux, спасибо за советы! :)

Как лучше сделать загрузку ядровых модулей при старте системы? У меня написан скрипт, который я запускаю с рутовыми правами на выполнение через консоль. Скрипт устанавливает драйвер для устройства. Хотелось бы, чтобы при каждой загрузке драйвер уже был установлен. Я пробовал прописывать путь к скрипту в файл /etc/rc.local , но скрипт не выполнялся. Видимо как-то надо делать по-другому или сделать дополнительные настройки. ) В файле есть строчка:

 
In order to enable or disable this script just change the execution bits.
Где можно задать указанные биты и надо ли вообще это делать?

ikseg
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.