【问题标题】:Is there a way to identify version of c/c++ library?有没有办法识别 c/c++ 库的版本?
【发布时间】:2010-03-30 03:06:11
【问题描述】:

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

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

【问题讨论】:

  • 男孩,我希望有一种标准的方式来做到这一点(除了命名约定)。
  • 在类似 linux 的系统上,版本在名称中,然后使用符号链接让编译器将名为共享库的版本嵌入到可执行文件中。

标签: c++ c unix


【解决方案1】:

C 库本身没有版本控制系统。充其量,图书馆里有一个符号告诉它。

【讨论】:

    【解决方案2】:

    Linux/Unix 精灵专用答案:

    带有.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 和相关页面。

    【讨论】:

      【解决方案3】:

      在 Mac OS X 上,有 otool,它会告诉您很多信息,包括版本和拱门(尽管 lipo -info 可能更适合拱门)。示例:

      $otool -L /usr/lib/libz.dylib
      /usr/lib/libz.dylib:
          /usr/lib/libz.1.dylib(兼容版本 1.0.0,当前版本 1.2.3)
          /usr/lib/libSystem.B.dylib(兼容版本 1.0.0,当前版本 123.0.0)
      

      otool -L 列出库或可执行文件(“目标文件”)链接到的所有库,但第一行是目标文件本身的“id”,其中包括版本号。不过,这可能仅限于 Mac。

      【讨论】:

        【解决方案4】:

        如果它有版本号的符号,那么您可以使用 strings -a file_name|grep 'the version symbol' 。如果您将库作为 rpm 的一部分,那么也许您可以使用 rpm 内部版本号来获取版本(不完全是库版本,但至少是某种形式的编号。)

        【讨论】:

        • 哈!这就是为什么我说它是否有版本号的符号。例如,在我们的内部库中,我们使用类似 @#version 的字符串来 grep 获取版本号。我不确定这个特定的静态库使用什么,或者它是否使用任何一个。如果您只是执行字符串并将其通过管道传输到文本文件,那么您应该能够看到 lib 中的所有符号,然后可能会寻找类似 ver 或 version 的东西……正如其他人所指出的那样,这并不容易。对不起,我希望我知道比这更好的答案。 :-)
        • 谢谢,我可以通过你的方法找到编译器信息。
        【解决方案5】:

        在 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 的引用粘贴到应用程序中。如果您查看应用程序中的符号表,您会发现它实际上为每个库存储了非常具体的版本信息,而不是它所链接的通用版本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-03
          • 2017-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多