我在这个问题上回答了很多,但是我仍然很困惑。
我知道头文件包含标识符的声明,而库包含这些标识符的定义?我们可以访问编译器中关联的.h文件,但如何访问库文件?
还有一个问题
我们只在程序中包含头文件,然后如何将库文件链接到它?
答案 0 :(得分:1)
让我尝试举例说明
header.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
#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.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 ++名称修改”
答案 1 :(得分:-3)
使用cscope工具查找库文件。
cmd 1:ctags -uR
cmd 2:cscope -uRC
根据要搜索的内容选择选项,您可以找到函数的定义,另一个函数调用的函数,库文件,源代码等等。
注意:根据Linux OS。