level 6
西安恩仪联教育
楼主

目录:1、c程序开发流程。
2、为什么要链接。
一、程序开发流程
一个c程序从编写到运行经历一下几个过程:编辑--》预处理--》编译--》汇编--》链接--》运行。各个步骤作用如下:
编辑:通过编辑器产生一个名为xxx.c的源代码文件
预处理:将源码文件中的头文件替换为头文件的内容,宏定义替换为宏体,根据条件编译选择保留或者舍弃相关代码部分,生成一个名为xxx.i的中间文件。
编译:将xxx.i的文件转变为xxx.s的汇编文件(即变为目标机器的汇编文件)
汇编:将xxx.s的汇编文件转为机器语言组成的名为xxx.o目标文件,但是该文件并不能执行。
链接:将xxx.o文件和相关库文件进行统一链接,产生一个真正的可执行程序。
关于链接多数c编程初学者都一知半解,模棱两可。仅知道不经过链接,
程不能运行,链接后就变为可执行程序,究竟为什么要链接,链接的作用和目的都不了解,接下来我们探究一下关于链接目的和作用。
二、为什么要链接
以下两种场景解释为什么要链接:
场景1:
一个c项目不可能是一个文件,多.c文件组成的项目如何编译,每一个.c文件单独编译为.o文件,例如假设工程中有main.c ex1.c ex2.c这三个.c文件,分别都编译为main.o ex1.o ex2.o三个目标文件,main.c中调用的函数在ex1.c和ex2.c中定义的,所以main.o中仅是调用函数的语句,并没有函数体,导致main.o无法执行。需要从ex1.o和ex2.o中获取所调用函数真正的函数体,或者说用ex1.o、ex2.o中函数体代替main.o中的函数调用语句,将main.o转为真正可以执行的程序,这个过程就称为链接。
场景2:
大家在编写.c程序时,肯定调用过库函数,包括标准库和第三方库函数。例如xxx.c中调用库函数yyy,将xxx.c编译为xxx.o文件时,其中库函数调用语句只是一个调用符号,库函数的函数体(真正的可执行代码)在哪里,没有函数体导致xxx.o程序自然就无法执行。库函数的函数体在库文件中,需要找到对应的库文件,从其中获取库函数的函数体,用其替代xxx.o中的函数调用语句,才能产生一个真正的可执行程序,这个过程也称为链接。
程序需要链接的主要原因是解决编译过程中产生的符号引用问题,确保不同源文件或模块间的代码、数据正确组合。编译阶段生成的目标文件(如.o文件)可能包含对其他文件中的函数、变量等引用(即符号)。链接器需解析这些符号,确定它们在最终可执行文件中的地址,否则程序运行时无法找到对应实现。链接器将多个目标文件合并为一个可执行文件,同时处理内存地址重定位。程序可能依赖第三方库(如标准库、数据库驱动等)。链接器需将库代码和数据添加到最终文件中,满足程序运行需求。