程序的编译和连接原理分析

记录下学习《跟我一块儿写makefile》这本书时整理的笔记。

1、原理说明

UNIX 下是 .o 文件,即 Object File,这个动做叫作编译(compile)。而后再把大量Object File 合成执行文件,这个动做叫做连接(link)。linux

通常来讲,每一个源文件都应该对应于一个中间目标文件(O 文件或是 OBJ 文件)。连接时,主要是连接函数和全局变量,因此,咱们可使用这些中间目标文件(O 文件或是OBJ文件)来连接咱们的应用程序。连接器并无论函数所在的源文件,只管函数的中间目标文件(Object File)。shell

咱们要给中间目标文件打个包,在 Windows 下这种包叫“库文件”(Library File),也就是.lib 文件,在 UNIX下,是 Archive File,也就是 .a 文件。bash

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。若是函数未被声明,编译器会给出一个警告,但能够生成 Object File。而在连接程序时,连接器会在全部的 Object File 中找寻函数的实现,若是找不到,那到就会报连接错误码(Linker Error),意思说是说,连接器未能找到函数的实现。你须要指定函数的Object File。函数

2、简单的编译连接流程实例

  1. 产生可执行文件a.out,中间产生main.o的目标文件,但在连接成功后删除。
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.c 
a.out  hello.c  main.c
复制代码
  1. -c 参数意味着只编译(compile) 产生main.o目标文件
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc -c main.c 
main.o  hello.c  main.c
复制代码
  1. 连接文件,默认为a.out
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.o
a.out
复制代码
  1. -o name 使连接器保存可执行文件为指定文件中,name为指定文件名。
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc -o main.o
gcc: fatal error: no input files
compilation terminated.
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.o -o run
hello.c  main.c  main.o  Makefile  run
复制代码
  1. 能够结合起来使用
gcc main.c -o run
复制代码

编译main.c并连接生成可执行文件run,并将中间产生的目标文件main.o删除。学习

3、目标文件打包与连接

使用ar命令将目标文件打包,不过通常这个动做都是在makefile中实现。 连接静态库参数说明,-L 表示静态库路径,-lmy 即连接libmy.a文件ui

root@chenwr-pc:/home/workspace/my_workspace/study/makefile# cat main.c 
#include <stdio.h>
void main()
{
	printf("Im a super man\n");
	hello();
	test();
}
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# ar rcs libmy.a test.o hello.o
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# gcc main.c -L . -lmy -o run
root@chenwr-pc:/home/workspace/my_workspace/study/makefile# ./run
Im a super man
hello world
test
复制代码

参考资料:spa

linux ar 命令的使用说明和实例讲解_linux shell_脚本之家 https://www.jb51.net/article/95627.htm.net

gcc 连接文件 - NeverWA的博客 - CSDN博客 https://blog.csdn.net/NeverWA/article/details/79948049code

相关文章
相关标签/搜索