Информация об изменениях

Сообщение Re[7]: подарок от индуса из mssql от 13.08.2019 8:16

Изменено 13.08.2019 8:23 AlexGin

Re[7]: подарок от индуса из mssql
Здравствуйте, уважаемый velkin, Вы писали:

V>Мне думается нужно к этому подходить с позиции, что если что-то не сработало как ожидалось, то как сделать так, чтобы сработало. Возьмём для примера более сложный случай, нужно чтобы программа загружала динамические библиотеки из папки ./lib, тогда как исполняемый файл лежит в ./. При этом программа должна быть переносимой. Очевидно, что по умолчанию такое условие не сработает ни в Windows, ни в GNU/Linux, но это ведь не значит, что такое невозможно.


Установочный пакет (инсталлятор) программы будет различаться для Linux и Windows — вот очевидное решение.

V>По поводу этого:

V>

V>Зависимость от библиотеки libqmapcontrol.so имеется, я эту библиотеку неоднократно пересобирал в том же самом Qt Creator.
V>В том же каталоге, где и файл MyApplication находится четыре файла:
V>libqmapcontrol.so
V>libqmapcontrol.so.0
V>libqmapcontrol.so.0.9
V>libqmapcontrol.so.0.9.7
V>То есть, нужный файл ЛЕЖИТ РЯДОМ!
V>Он откомпилирован с тем же самым GCC, что и мой исполнимый файл!


Эта проблема уже давно как решена, причём даже несколькими способами!

V>Хотелось бы обратить внимания на то, что libqmapcontrol.so может быть символической ссылкой. Это как если в Windows скопировать ярлыки вместо библиотек, но это я на всякий случай напоминаю, мало ли. Лучше всего копировать реальный файл и переименовать его соответствующим образом, то есть одна библиотека, один реальный файл, а не куча непонятно чего. Опять же убедиться, что всё находится в рабочем каталоге.


Здесь успешно работают два варианта:
— через /usr/lib (просто копируя туда все вышеуказанные файлы под "рутом");
— используя переменную окружения LD_LIBRARY_PATH (со значением '.' — точка) — то есть загружать библиотеки из текущего директория.

V>Вторым этапом я бы изучил подгрузку динамических библиотек, этим можно управлять, то есть нужно разбираться в компиляции и так далее. Сказал бы подробнее, но я знаю лишь куда копать, а вот изучать этот вопрос когда-то давно было лень. Qt ещё имеет класс QLibrary, опять же система плагинов, но лучше наверное сначала изучить универсальные методы работы с динамическими библиотеками вне зависимости от проекта.


Я в курсе насчёт плагинов Qt (QtPlugin).
Применял их пару лет назад. Сделал систему плагинов для проектов в моей прежней конторе.
Это решение хорошее, но оно скорее в стиле "кроссплатформенный_COM". Там много избыточных сущностей (неактуальных для повседневных задач).
В то же время, в описываемом мной проекте требовалось решение в стиле "дешево_и_сердито" — простая DLL (или *.so файл — в терминологии Linux).
Re[7]: подарок от индуса из mssql
Здравствуйте, уважаемый velkin, Вы писали:

V>Мне думается нужно к этому подходить с позиции, что если что-то не сработало как ожидалось, то как сделать так, чтобы сработало. Возьмём для примера более сложный случай, нужно чтобы программа загружала динамические библиотеки из папки ./lib, тогда как исполняемый файл лежит в ./. При этом программа должна быть переносимой. Очевидно, что по умолчанию такое условие не сработает ни в Windows, ни в GNU/Linux, но это ведь не значит, что такое невозможно.


Установочный пакет (инсталлятор) программы будет различаться для Linux и Windows — вот очевидное решение.
Причём — совсем НЕ ОБЯЗАТЕЛЬНО делать различные инсталляторы!
Все отличия могут выглядеть как-то так:
#ifdef Q_OS_WIN
...
#endif

#ifdef Q_OS_LINUX
...
#endif


V>По поводу этого:

V>

V>Зависимость от библиотеки libqmapcontrol.so имеется, я эту библиотеку неоднократно пересобирал в том же самом Qt Creator.
V>В том же каталоге, где и файл MyApplication находится четыре файла:
V>libqmapcontrol.so
V>libqmapcontrol.so.0
V>libqmapcontrol.so.0.9
V>libqmapcontrol.so.0.9.7
V>То есть, нужный файл ЛЕЖИТ РЯДОМ!
V>Он откомпилирован с тем же самым GCC, что и мой исполнимый файл!


Эта проблема уже давно как решена, причём даже несколькими способами!

V>Хотелось бы обратить внимания на то, что libqmapcontrol.so может быть символической ссылкой. Это как если в Windows скопировать ярлыки вместо библиотек, но это я на всякий случай напоминаю, мало ли. Лучше всего копировать реальный файл и переименовать его соответствующим образом, то есть одна библиотека, один реальный файл, а не куча непонятно чего. Опять же убедиться, что всё находится в рабочем каталоге.


Здесь успешно работают два варианта:
— через /usr/lib (просто копируя туда все вышеуказанные файлы под "рутом");
— используя переменную окружения LD_LIBRARY_PATH (со значением '.' — точка) — то есть загружать библиотеки из текущего директория.

V>Вторым этапом я бы изучил подгрузку динамических библиотек, этим можно управлять, то есть нужно разбираться в компиляции и так далее. Сказал бы подробнее, но я знаю лишь куда копать, а вот изучать этот вопрос когда-то давно было лень. Qt ещё имеет класс QLibrary, опять же система плагинов, но лучше наверное сначала изучить универсальные методы работы с динамическими библиотеками вне зависимости от проекта.


Я в курсе насчёт плагинов Qt (QtPlugin).
Применял их пару лет назад. Сделал систему плагинов для проектов в моей прежней конторе.
Это решение хорошее, но оно скорее в стиле "кроссплатформенный_COM". Там много избыточных сущностей (неактуальных для повседневных задач).
В то же время, в описываемом мной проекте требовалось решение в стиле "дешево_и_сердито" — простая DLL (или *.so файл — в терминологии Linux).