Как получить номер версии библиотеки в Linux
Модератор: Модераторы
Как получить номер версии библиотеки в Linux
Есть необходимость контролировать номер версии подключаемой динамической библиотеки(*.so).
Для Win / Delphi использую GetFileVersionInfo.
В Linux для приложения номер версии получаю через TFileVersionInfo, в котором используется имя исполняемого файла из paramstr(1).
Как получить значение FileVersion для библиотеки?
Для Win / Delphi использую GetFileVersionInfo.
В Linux для приложения номер версии получаю через TFileVersionInfo, в котором используется имя исполняемого файла из paramstr(1).
Как получить значение FileVersion для библиотеки?
Универсальный вариант (если у Вас rpm-дистрибутив):
Вместо "libmpfr6" пишете правильное название нужной библиотеки.
Как запустить эту команду из своей программы:
http://freepascal.ru/article/freepascal/20191121080000/
Код: Выделить всё
rpm -qi libmpfr6 | grep VersionКак запустить эту команду из своей программы:
http://freepascal.ru/article/freepascal/20191121080000/
Если следовать совету получится так : приложение вызывает функцию из библиотеки, а та в свою очередь вызывает внешнюю программу(rpm).Vadim писал(а):Универсальный вариант (если у Вас rpm-дистрибутив):Вместо "libmpfr6" пишете правильное название нужной библиотеки.Код: Выделить всё
rpm -qi libmpfr6 | grep Version
Как запустить эту команду из своей программы:
http://freepascal.ru/article/freepascal/20191121080000/
Хочется найти аналог GetModuleFileName для получения информации о файле библиотеки
Не совсем понимаю о чём Вы, но если у библиотеки есть функция возвращающая её версию, то Вам ничего кроме этой функции вызывать уже не надо. А вот если такой функции нет, то ничего ни из какой библиотеки не вызываете - сразу и непосредственно запускаете команду и всё.mrPG писал(а):приложение вызывает функцию из библиотеки, а та в свою очередь вызывает внешнюю программу(rpm).
Никак. Vadim все правильно говорит, только с помощью менеджера пакетов. И то не всегда...mrPG писал(а):Как получить значение FileVersion для библиотеки?
Как то безрадостно((WAYFARER писал(а):Никак. Vadim все правильно говорит, только с помощью менеджера пакетов. И то не всегда...mrPG писал(а):Как получить значение FileVersion для библиотеки?
Под Win никакой проблемы для получения информации о загруженной dll нет, а под Linux - решения нет?
Тут проблема в том, что требуемая вам информация в файле просто-напросто отсутствует.mrPG писал(а):Под Win никакой проблемы для получения информации о загруженной dll нет, а под Linux - решения нет?
Впрочем в Windows для dll она тоже далеко не всегда будет... это зависит от того, добавил ли автор информацию о версии
Поскольку библиотеку создаю я сам, то информация о номере версии в файлах и приложения, и библиотеки есть.WAYFARER писал(а):Тут проблема в том, что требуемая вам информация в файле просто-напросто отсутствует.mrPG писал(а):Под Win никакой проблемы для получения информации о загруженной dll нет, а под Linux - решения нет?
Впрочем в Windows для dll она тоже далеко не всегда будет... это зависит от того, добавил ли автор информацию о версии
С Win вообще никаких проблем.
Под linux из исполняемого файла я ее получаю, а вот как получить от динамической библиотеки - не знаю (
mrPG
Очень похоже, что Вы делаете проблему из пустого места. Если речь идёт о Вашей собственной библиотеке, то сделайте там функцию, которая выдаёт её версию. Это будет в высшей степени кроссплатформенный вариант.
Очень похоже, что Вы делаете проблему из пустого места. Если речь идёт о Вашей собственной библиотеке, то сделайте там функцию, которая выдаёт её версию. Это будет в высшей степени кроссплатформенный вариант.
Можете подсказать как сделать так, чтобы изменять номер версии не "ручками", а читать из файла *.so при вызове содержащейся в нем функции, т.е. изнутри ?Vadim писал(а):mrPG
Очень похоже, что Вы делаете проблему из пустого места. Если речь идёт о Вашей собственной библиотеке, то сделайте там функцию, которая выдаёт её версию. Это будет в высшей степени кроссплатформенный вариант.
NB : Вызывающее функцию родительское приложение не мое, поэтому номер версии должен содержаться в строке, которую функция возвращает.
Что то вы похоже где то перемудрили, если у вас в принципе такая проблема встала.
Вы делаете библиотеку, которую использует некое стороннее приложение? Если обязательно нужно проверять версии библиотеки, что мешает добавить функцию? прямо в этой же библиотеки. Что то типа
и меняйте версию при каждом новом релизе либы.
Добавлено спустя 2 минуты 52 секунды:
Вы делаете библиотеку, которую использует некое стороннее приложение? Если обязательно нужно проверять версии библиотеки, что мешает добавить функцию? прямо в этой же библиотеки. Что то типа
Код: Выделить всё
function GetVersion (): Pchar; stdcall;
begin
result := Pchar('1.1.3');
end; и меняйте версию при каждом новом релизе либы.
Добавлено спустя 2 минуты 52 секунды:
Кто вам сказал, что она есть? почитайте про структуру elf файлов.mrPG писал(а):Поскольку библиотеку создаю я сам, то информация о номере версии в файлах и приложения, и библиотеки есть.
- Alexx2000
- постоялец
- Сообщения: 490
- Зарегистрирован: 25.10.2006 00:22:07
- Откуда: Мытищи
- Контактная информация:
Если и программа и библиотека на FPC, то версию можно прочитать так:
где FileName полный путь к библиотеке.
Код: Выделить всё
uses
Resource, elfreader, ...
...
function GetFileVersion(const FileName: String): String;
var
Version: TVersionInfo;
begin
Version:= TVersionInfo.Create;
try
Version.Load(FileName);
with Version.FixedInfo do
Result:= Format('%d.%d.%d', [FileVersion[0], FileVersion[1], FileVersion[2]]);
except
Result:= EmptyStr;
end;
Version.Free;
end;
...
initialization
TResources.RegisterReader('.so', TElfResourceReader);
Можно и почитать, но для приложения, которое обращается к библиотеке, на fpc/Lazarus номер версии прекрасно определяется с помощью TFileVersionInfo с определением имени файла через paramstr(1), Для библиотеки определить имя файла из программы не получаетсяWAYFARER писал(а):Что то вы похоже где то перемудрили, если у вас в принципе такая проблема встала.
Вы делаете библиотеку, которую использует некое стороннее приложение? Если обязательно нужно проверять версии библиотеки, что мешает добавить функцию? прямо в этой же библиотеки. Что то типаКод: Выделить всё
function GetVersion (): Pchar; stdcall; begin result := Pchar('1.1.3'); end;
и меняйте версию при каждом новом релизе либы.
Менять вручную ?? Не наш метод
Добавлено спустя 2 минуты 52 секунды:Кто вам сказал, что она есть? почитайте про структуру elf файлов.mrPG писал(а):Поскольку библиотеку создаю я сам, то информация о номере версии в файлах и приложения, и библиотеки есть.
Добавлено спустя 3 минуты 39 секунд:
В этом случае надо задавать полный путь к библиотеке, а он на разных ПК может различаться.Alexx2000 писал(а):Если и программа и библиотека на FPC, то версию можно прочитать так:где FileName полный путь к библиотеке.Код: Выделить всё
uses Resource, elfreader, ... ... function GetFileVersion(const FileName: String): String; var Version: TVersionInfo; begin Version:= TVersionInfo.Create; try Version.Load(FileName); with Version.FixedInfo do Result:= Format('%d.%d.%d', [FileVersion[0], FileVersion[1], FileVersion[2]]); except Result:= EmptyStr; end; Version.Free; end; ... initialization TResources.RegisterReader('.so', TElfResourceReader);
Конечно есть вариант сделать ini-файл, из которого считывать этот путь, но хотелось решить это программно.
Добавлено спустя 33 минуты 26 секунд:
Alexx2000 писал(а):Если и программа и библиотека на FPC, то версию можно прочитать так:где FileName полный путь к библиотеке.Код: Выделить всё
uses Resource, elfreader, ... ... function GetFileVersion(const FileName: String): String; var Version: TVersionInfo; begin Version:= TVersionInfo.Create; try Version.Load(FileName); with Version.FixedInfo do Result:= Format('%d.%d.%d', [FileVersion[0], FileVersion[1], FileVersion[2]]); except Result:= EmptyStr; end; Version.Free; end; ... initialization TResources.RegisterReader('.so', TElfResourceReader);
К сожалению, для *.so получаю сообщение No version info load ((
- Alexx2000
- постоялец
- Сообщения: 490
- Зарегистрирован: 25.10.2006 00:22:07
- Откуда: Мытищи
- Контактная информация:
Путь до загруженной библиотеки можно узнать так, пример:
результат
Код: Выделить всё
h:= LoadLibrary('libc.so.6');
@getrandom:= GetProcAddress(H, 'getrandom');
WriteLn('LIB: ', mbGetModuleName(@getrandom));
LIB: /usr/lib/libc.so.6
Вот рабочая демка, в архиве пример библиотеки с версией и консольной программы которая её читает.mrPG писал(а): К сожалению, для *.so получаю сообщение No version info load ((
mrPG
Давайте ещё раз уточним: Вы свою библиотеку на каком языке программирования пишите?
Давайте ещё раз уточним: Вы свою библиотеку на каком языке программирования пишите?
