代码之家  ›  专栏  ›  技术社区  ›  Xinus

编译器如何使用lib文件?

  •  4
  • Xinus  · 技术社区  · 16 年前

    我很好奇c/c++编译器是如何分析lib文件的?我的意思是说,我创建了一个包含一些类的库,我在我的主程序中使用这个库。编译器如何知道该库中有哪些类名。当然,这些信息是以二进制格式存在的,我想在我的程序中使用这些功能,具体来说,我有一个二进制lib文件,我想知道该lib文件中存在的所有类和属性/函数。

    有可能吗?如果编译器可以做到这一点,为什么有些库不能做到?

    谢谢你的提示

    4 回复  |  直到 16 年前
        1
  •  6
  •   Brian R. Bondy    16 年前

    编译器不会执行您建议的操作,但链接器会执行。

    然后,链接器将包含的声明、lib文件及其其他对象文件放在一起。

    可能可以从中获取信息。例如,通过反编译来创建lib文件,但这需要大量工作,可能不是您想要做的。

        2
  •  1
  •   BCS    16 年前

    .a Linux上的文件(对于windows不太确定)库文件只是一个存档文件(因此 .一

    如果你想知道里面是什么,请获取库工具(IIRC ar

        3
  •  1
  •   asc99c    15 年前

    通常情况下 .a nm libxxx.a

    /usr/lib> nm libc.a | head -10
    init-first.o:
             U abort
             U _dl_non_dynamic_init
    0000000000000000 T _dl_start
             w _dl_starting_up
             U __environ
             U __fpu_control
             U __init_misc
    0000000000000004 C __libc_argc
    

    这个 nm manpage有很多关于输出含义的细节。

    ar 命令可以为您提取单个文件,例如。

    ~/tmp> ar x libc.a init-first.o
    ~/tmp> file init-first.o
    init-first.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
    

    正如您在上面看到的,这里的对象是ELF格式的,因此对于您所要求的复杂部分,您真正需要的是能够检查ELF二进制文件的东西。Linux通常随命令一起提供 readelf

    ~/tmp> readelf -s init-first.o
    Symbol table '.symtab' contains 19 entries:
    Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000000     0 SECTION LOCAL  DEFAULT    1
     2: 00000000     0 SECTION LOCAL  DEFAULT    3
     3: 00000000     0 SECTION LOCAL  DEFAULT    4
     4: 00000000     0 SECTION LOCAL  DEFAULT    5
     5: 00000000     0 SECTION LOCAL  DEFAULT    6
     6: 00000000    11 FUNC    GLOBAL DEFAULT    1 _dl_start
     7: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND abort
     8: 00000010   133 FUNC    GLOBAL DEFAULT    1 __libc_init_first
     9: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _dl_starting_up
    ...
    

    有一个图书馆 libelf 这很可能是你想要的,并通过编程访问这些信息。我从未使用过它,因为我总是从可用的命令行工具中获得所需的信息。

    http://directory.fsf.org/wiki/Libelf

        4
  •  0
  •   Community Mohan Dere    9 年前

    Brian R. Bondy's answer

    class SomeClass implements SomeInterface {
        int get(class &otherClass c, float x);
        bool reallyCoolMethod(int x);
        ...
    }
    

    这确实没有什么帮助。图书馆文档应该解释您为什么要使用它以及如何使用它;如果库没有这样的文档记录,您可能需要更好的库。