C++ 其中是c+中编译器中存储的标识符的定义(而不是声明)+;?

C++ 其中是c+中编译器中存储的标识符的定义(而不是声明)+;?,c++,c++11,C++,C++11,关于这个问题,我已经讨论了很多答案,但我仍然很困惑 我知道头文件包含标识符声明,而库包含这些标识符的定义?我们可以访问编译器中关联的.h文件,但如何访问库文件 还有一个问题 我们只在程序中包含头文件,然后库文件如何链接到它?使用cscope工具查找库文件 cmd 1:ctags-uR cmd 2:cscope-uRC 根据要搜索的内容选择选项,您可以找到函数定义、其他函数调用的函数、库文件、源代码等 注意:这是基于Linux操作系统的。让我试着用一个例子来说明 标题.h int func(int

关于这个问题,我已经讨论了很多答案,但我仍然很困惑

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

还有一个问题


我们只在程序中包含头文件,然后库文件如何链接到它?

使用cscope工具查找库文件

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

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


注意:这是基于Linux操作系统的。

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

标题.h

int func(int in);
a、 cpp

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

现在让我们编译

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.cpp中定义的主函数,我们还看到了一个名为
\u 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
这里有
\u Z4funci

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

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

如果您想知道
\u Z4funci
是如何决定名称的,请阅读“C++名称混乱”

库中的信息存储为二进制数据,编译后您无法轻松查看定义。您无法直接访问库的源代码,因为它已预编译。但是库代码通常是在线可用的。我认为你把标识符(名称)与它们标识的东西(类型、名称空间、变量、函数等)混淆了。@molbdnilo先生,我们把它们标识的“东西”称为什么?你需要库的完整源代码。如果库完全是用头文件定义的(例如,基于模板的库),那么.h文件将声明并定义整个库。否则,您需要用于构建已编译库(二进制文件)的原始源代码。这仍然要求您实际将源代码作为未编译文本保存在某处。如果您只有一个库文件,这将毫无帮助。
g++ a.o b.o -o out
./out