有没有办法识别c / c ++库的版本?

时间:2010-03-30 03:06:11

标签: c++ c unix

例如,如何获取/usr/lib/libz.a的版本?如果可以获取其他有用的信息,例如编译器/拱门等,那就太棒了。

我想知道这个的原因是gcc总是说当我编译我的程序并与特定的版本化libz链接时,它忽略了我在命令行中提供的libz。 gcc认为/usr/lib/libz.a是合适的。

5 个答案:

答案 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中的readelfdumpelf命令,您可以提取有关共享对象的元数据,包括其规范名称,构建它的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存储了非常具体的版本信息,而不是它所链接的通用版本。