Есть ли способ определить версию библиотеки c / c ++? - PullRequest
3 голосов
/ 30 марта 2010

Например, как получить версию /usr/lib/libz.a? Было бы здорово, если бы можно было получить другую полезную информацию, такую ​​как компилятор / архив и т. Д.

Причина, по которой я хочу это знать, заключается в том, что gcc всегда говорит, что игнорирует libz, который я предложил в командной строке, когда я компилирую свою программу и связываю ее с определенной версией libz. gcc считает, что /usr/lib/libz.a является правильным.

Ответы [ 5 ]

6 голосов
/ 30 марта 2010
Библиотеки

C не имеют собственной системы управления версиями. В лучшем случае в библиотеке есть символ, который говорит об этом.

2 голосов
/ 30 марта 2010

Ответ для Linux / Unix Elf:

Библиотечные архивы с расширением .a представляют собой архив ar (немного похожий на tar или несжатый zip, по модулю несколько функций), который содержит не что иное, как исходные объектные файлы, упакованные вместе. В этих файлах редко встречаются дополнительные метаданные. Вы вряд ли найдете информацию о компиляторе, если он не сохранил эту информацию в исходных .o файлах. Вы можете просмотреть содержимое архива с помощью команды ar:

ar -t /usr/lib/libz.a

Или команда objdump:

objdump -a /usr/lib/libz.a

Общие объектные файлы (.so) и исполняемые файлы - это отдельная история. Используя команды readelf и dumpelf из elfutils, вы можете извлекать метаданные об общем объекте, включая его каноническое имя, для чего libc он был создан, для какой инструментальной цепочки он был создан и т. Д. Подробнее см. man readelf и соответствующие страницы.

1 голос
/ 30 марта 2010

Если у него есть символ для версии #, вы можете использовать строки -a имя_файла | grep 'символ версии'. Если вы получили библиотеку как часть rpm, то, возможно, вы можете использовать номер сборки rpm, чтобы получить версию (не совсем версию библиотеки, но, по крайней мере, какую-то форму нумерации).

1 голос
/ 30 марта 2010

В Mac OS X есть otool, который сообщает вам множество вещей, включая версию и арку (хотя lipo -info, вероятно, лучше для арки). Пример:

$otool -L /usr/lib/libz.dylib 
/usr/lib/libz.dylib:
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0)

otool -L перечисляет все библиотеки, на которые ссылается библиотека или исполняемый файл («объектный файл»), но первая строка - это «идентификатор» самого объектного файла, который включает номер версии. Это, вероятно, только для Mac.

0 голосов
/ 30 марта 2010

В системах Linux (подобных) версия обычно указана в названии.
Это своего рода скрыто, поскольку библиотеки, с которыми вы ссылаетесь, символически связаны с определенной версией:

> ls -l /usr/lib/libncurses.dylib
lrwxr-xr-x  1 root  wheel  20 Feb 28 16:08 libncurses.dylib -> libncurses.5.4.dylib

Поэтому, когда вы ссылаетесь на -lncurses, компилятор фактически вставляет ссылку на libncurses.5.4 в приложение. Если вы посмотрите на таблицу символов в приложении, то увидите, что в ней хранится очень специфическая информация о версии для каждой библиотеки, а не общая версия, с которой она была связана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...