2010-03-30 4 views
3

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

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

+1

Мальчик, я бы хотел, чтобы был стандартный способ сделать это (помимо соглашений об именах). –

+0

В подобных Linux системах версия находится в названии, а затем символические ссылки используются, чтобы заставить компилятор вставить версию, названную совместно используемой библиотекой, в исполняемый файл. –

ответ

6

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

1

В 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.

1

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

+0

Извините, grep что, пожалуйста? – solotim

+0

Ха! Вот почему я сказал, если у него есть символ для номера версии. Например, в наших внутренних библиотеках мы используем что-то вроде строки @ # version для grep для номера версии. Я не уверен, что использует эта конкретная статическая библиотека или вообще использует ее. Если вы просто выполняете строки и транслируете их в текстовый файл, вы должны иметь возможность видеть все символы в lib, а затем, возможно, искать что-то вроде ver или version ..., как другие отметили, что это непросто. Извините, мне жаль, что я не знал лучшего ответа. :-) – CoolBeans

+0

Спасибо, я могу найти информацию о компиляторе по вашему методу. – solotim

2

Linux/Unix Elf-specific answer:

Библиотека архивов с расширением .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 и связанные страницы.

0

В системах 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 в приложение. Если вы посмотрите на таблицу символов в приложении, вы увидите, что на самом деле она хранит очень конкретную информацию о версии для каждого lib, а не общую версию, с которой она была связана.