存储在 C++ 编译器中的标识符的定义(不是声明)在哪里?
where are the definition (not declaration) of identifiers stored in a compiler in c++?
关于这个问题,我经历了很多答案,但我仍然非常困惑。
我知道头文件包含标识符的声明,而库包含这些标识符的定义? 我们可以访问编译器中关联的.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操作系统。
相关文章:
- 在哪里声明结构运算符重载
- 在哪里放置函数声明?
- 存储在 C++ 编译器中的标识符的定义(不是声明)在哪里?
- 当线程处理不同的类时,应该在哪里声明条件变量、互斥对象
- Microsoft标头对声明没有注释,所以文档在哪里
- 在哪里声明枚举
- 在派生类或基类中,我应该在哪里声明友元类
- 在基本的GUI编程中,在哪里声明对象和方法
- 不确定在哪里定义并声明我的结构.(获得未申报的标识符)
- VS2010-关于资源相对路径 - 在哪里声明变量
- 第一个C 库:我不确定在哪里参考并声明我的变量
- 我想知道根据程序员的哲学在哪里声明变量
- 在哪里声明从Qt SIGNAL/SLOT返回的对象
- 在哪里/如何声明和实现必须由成员方法使用的帮助函数
- 我应该在哪里声明一个涉及多次实例化的类的枚举类
- 参数:在哪里声明它们
- 应该在哪里声明函数原型
- cvarrToMat在哪里声明
- 在哪里为QMainWindow声明某些Qt对象:在头文件或构造函数中
- cout是在iostream中声明的,但它是在哪里定义的