例如,如何获取/usr/lib/libz.a的版本?如果可以获取其他有用的信息,例如编译器/拱门等,那就太棒了。
我想知道这个的原因是gcc总是说当我编译我的程序并与特定的版本化libz链接时,它忽略了我在命令行中提供的libz。 gcc认为/usr/lib/libz.a是合适的。
答案 0 :(得分:6)
C库本身没有版本控制系统。充其量,图书馆中有一个符号告诉它。
答案 1 :(得分:2)
Linux / Unix Elf特定的答案:
带有.a
扩展名的图书馆归档是一个ar
归档(有点像tar
或未压缩的zip
,模块化一些功能),其中不再包含任何内容比原始对象文件打包在一起。这些文件中很少有额外的元数据。除非将该信息存储在原始.o
文件中,否则您不太可能找到有关编译器的任何信息。您可以使用ar
命令查看存档的内容:
ar -t /usr/lib/libz.a
或objdump
命令:
objdump -a /usr/lib/libz.a
共享对象文件(.so
)和可执行文件是另一回事。使用elfutils中的readelf
和dumpelf
命令,您可以提取有关共享对象的元数据,包括其规范名称,构建它的libc
,工具链构建它,等等。有关详细信息,请参阅man readelf
及相关网页。
答案 2 :(得分: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
列出库或可执行文件(“目标文件”)链接到的所有库,但第一行是目标文件本身的“id”,其中包括版本号。这可能只是Mac版。
答案 3 :(得分:1)
如果它有版本号的符号,则可以使用字符串-a file_name | grep'版本符号'。如果您将库作为rpm的一部分,那么也许您可以使用rpm内部版本号来获取版本(不完全是库版本,但至少是某种形式的编号。)
答案 4 :(得分: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存储了非常具体的版本信息,而不是它所链接的通用版本。