存储在 C++ 编译器中的标识符的定义(不是声明)在哪里?

where are the definition (not declaration) of identifiers stored in a compiler in c++?

本文关键字:声明 在哪里 定义 C++ 编译器 标识符 存储      更新时间:2023-10-16

关于这个问题,我经历了很多答案,但我仍然非常困惑。

我知道头文件包含标识符的声明,而库包含这些标识符的定义? 我们可以访问编译器中关联的.h文件,但是如何访问库文件?

还有一个问题

我们在程序中只包含头文件,那么库文件是如何链接到它的呢?

让我尝试用一个例子来说明

标题.h

int func(int in);

答.cpp

#include "header.h"
int main(int argc, const char** argv)
{
int b = func(2);
return 0;
}

乙.cpp

#include "header.h"
int func(int in)
{
return in*2;
}

现在让我们编译

g++ -c -o a.o  a.cpp

我们可以看看生成的对象文件的符号表

objdump -t a.o
a.o:     file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 a.cpp
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000000 l    d  .data  0000000000000000 .data
0000000000000000 l    d  .bss   0000000000000000 .bss
0000000000000000 l    d  .note.GNU-stack        0000000000000000 .note.GNU-stack
0000000000000000 l    d  .eh_frame      0000000000000000 .eh_frame
0000000000000000 l    d  .comment       0000000000000000 .comment
0000000000000000 g     F .text  0000000000000023 main
0000000000000000         *UND*  0000000000000000 _GLOBAL_OFFSET_TABLE_
0000000000000000         *UND*  0000000000000000 _Z4funci

因此,我们看到 a 中定义的 main 函数.cpp我们还看到一个名为_Z4funci的条目(这是标识"func"的原因(,但它被标记为未定义(地址之前的*UND*(。因此,链接器稍后将在另一个对象中查找它。

现在让我们看看b

g++ -c -o b.o  b.cpp
objdump -t a.o
b.o:     file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 b.cpp
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000000 l    d  .data  0000000000000000 .data
0000000000000000 l    d  .bss   0000000000000000 .bss
0000000000000000 l    d  .note.GNU-stack        0000000000000000 .note.GNU-stack
0000000000000000 l    d  .eh_frame      0000000000000000 .eh_frame
0000000000000000 l    d  .comment       0000000000000000 .comment
0000000000000000 g     F .text  000000000000000e _Z4funci

_Z4funci的定义

现在,您可以将两者链接在一起以创建完整的可执行对象

g++ a.o b.o -o out
./out

如果您想知道决定的名称_Z4funci如何,请阅读"C++名称修改">

使用cscope工具找出库文件。

cmd 1 : ctags -uR
cmd 2 : cscope -uRC

根据您要搜索的内容选择选项,您可以找到函数的定义,由其他函数调用的函数,库文件,源代码等等。

注意:这是根据Linux操作系统。