- compile:编译,对代码进行语法检查,将程序转化为计算机可执行的二进制文件,生成.obj .o文件,vc++生成.obj文件
- build:链接,将程序中调用到的类库融合到程序中,生成.exe文件
先compile再build
java中的
compile:将源代码转换为可执行代码的过程,将java编译为class文件,非java文件原封不动的复制到编译目录,之编译选定的目标,不管之前是否编译过
make:编译选定的目标,只编译上次编译变化过的文件,节省时间
build:对整个工程重新编译,不管是否已经编译过,生成发布包
编译过程
预处理 编译 汇编
源代码test.c -> 预处理文件test.i -> 汇编文件 test.s -> 目标文件 test.o -> 可执行文件 test.exe
预处理
将所有的#include头文件以及宏定义替换成真正的内容
gcc -E test.c -o test.i -E让编译器在预处理后就退出
编译
gcc -S test.i -o test.s 汇编文件
-S 编译后就停止
汇编
gcc -c test.s -o test.o 二进制文件
链接 linking
链接过程使用连接器将该目标文件与其他目标文件,库文件,启动文件等链接起来生成可执行文件
gcc test.o -o test.exe
动态 静态链接
静态链接由连接器在连接时将库的内容自动加到可执行程序中,连接器是一个独立程序,将一个或多个库或目标文件(之前由编译器或汇编器生成),连接到一块生成可执行程序,库是指静态链接库,windows以.lin,linux以.a
动态链接,把链接过程推迟到了运行时再进行,在可执行文件装载时或运行时,由操作系统装载程序加载动态链接库,windows .dll,linux以.so为后缀,在windows下动态链接也可以用到.lib为后缀文件.lib叫做导入库,是由.dll文件生成的
- 静态优点:代码装载速度快,执行速度比动态链接库更快,只需保证在开发者计算机有正确的lib'文件,以二进制发布的时候不用考虑用户计算级是否有lib文件存在
缺点:生成的可执行文件体积大 - 动态优点:可执行文件小,开发过程独立,耦合小,不同编程语言编写3的程序只要按照函数调用约定就可以调用同一个DLL函数,DLL文件和EXE文件独立,只要输出接口不变(名称,参数,返回值类型,调用约定不变),更换dll文件不会对exe文件造成影响
缺点:使用动态链接库的应用程序是不完整的,依赖的DLL模块也要存在,如果在载入动态链接,程序启动发现dll不存在,会报错,速度比静态慢
实现
- 静态:
- gcc -c test.c main.c 编译,汇编指定的源文件,编译成目标文件,test.o,main.o
- ar工具将o文件打包成静态库晚间lib_test.lib
ar rv lib_tset.lib test.o main.o - 生成可执行文件
gcc lib_test.lib -o lib_test.exe
双击exe可运行,并且删除lib_test.lib也可以运行
- 动态:
- test.c编译成动态库文件dll_test.dll
gcc test.c -shared -o dll_test.dll - 动态库文件和main.c一起编译生成dll_test.exe文件
gcc dll_test.dll main.c -o dll_test.exe
双击可运行,但如果把dll_test.dll删除后就无法运行了