目录

久违的更新之链接

一个c文件调用另一个c文件的方法,如何找到?

hello.h

#ifndef HELLO
#define HELLO
int fn_c(int x_local);
#endif

hello.c

/* 这是一个存在于程序别处的某个全局变量的声明 */
extern int z_global;

/* 这是一个函数的定义,函数参数可以认为是局部变量 */
int fn_c(int x_local)
{
    return (z_global + x_local);
}

hello_main.c

#include"hello.h"
#include<stdio.h>
int z_global = 1;
int main(int argc, char *argv[])
{
    printf("%d", fn_c(10));
    return 0;
}

hello_main.c 中引用了 hello.c 中的 fn_c 方法,我们单独编译 hello_main.c

gcc -c hello_main.c -o hello_main.o
nm hello_main.o  //查看符号表命令

这个不会报错,但是很好奇这个 fn_c 他要怎么表示呢?因为此时都没有编译 hello.c,结果居然是···空着的
/img/in-post/nm_hello_main.png

之后我们编译 hello.c,链接这两个文件

gcc -c hello.c -o hello.o
gcc hello.o hello_main.o -o main.out
nm main.out  //查看符号表命令

/img/in-post/nm_hello_out.png

这时候 fn_c 就找到啦!

链接的神奇操作~~

所以正如各种文章所说:

链接器主要是将有关的目标文件彼此相连接生成可加载、可执行的目标文件。链接器的核心工作就是符号表解析和重定位。