一、使用gcc编译 输出可执行文件
1)在ubuntu上执行gcc main.c -o main,得到可执行程序main
2)执行程序 ./main 111 222 333 44 555 66,可得到以下输出
3)一个程序的生成可执行文件的过程如下:
二、库的应用
1)库的概念
库文件:是一个二进制可执行文件,将多个目标文件统一整理合成为一个文件便于使用和管理。
2)库的分类
1.静态库:通过静态库封装的功能函数,在程序编译到链接库步骤的时候,会将函数继承到可执行程序中,即编译程序时,静态库中的函数被拷贝到当前的程序中。
<1>命名:以lib开头,以.a结尾,如libxxx.a,xxx为库名称。
<2>制作指令:
①编译:使用gcc 将plus.c 编译输出plus.o:gcc -c plus.c -o plus.o
②打包:使用ar命令将plus.o打包为静态库:ar crs libplus.a plus.o
③链接:在main.c plus.h libplus.a同一个目录的情况下,编译并链接库:gcc main.c -o main -L. -l plus
其中,-L 和 -l 用于指定库文件的路径和库文件名。 此命令中-L.指在当前目录路径中查找库文件,-l plus为指定查找库文件名为 libplus.a进行链接
<3>ar指令:
ar | 创建、修改和提取静态库.a文件 |
---|---|
c | 创建一个库 |
r | 在库中插入模块(替换),已存在则更新 |
s | 添加或更新目标文件索引,区分大小写,区别是否生成符号表 |
d | 从静态库中删除文件objfile |
x | 从静态库文件中抽取文件objfile |
2.动态库:用动态库封装的功能函数,把库函数的链接推迟到程序运行的时候,当程序执行到库函数的时候,会到内存中找动态库函数。
<1>命名:以 lib 开头,以.so 结尾,如libxxx.so,xxx为库名称。
<2>制作指令:
①编译:使用gcc 将plus.c 编译输出plus.o:gcc -c -fpic plus.c -o plus.o
②打包:使用-shared命令将plus.o打包为动态库:gcc -shared -o libmylib.so plus.o
③链接:gcc main.c libmylib.so main -L. -l plus
其中,PIC(Position Independent Code,位置无关代码),调用代码通过相对地址标识调用代码的位置,模块中的指令与该模块被加载到内存中的位置无关。
3)两种库的区别
优点 | 缺点 | |
---|---|---|
动态库 | 动态库的改变并不影响程序,所以动态函数库升级比较方便 在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小 | 因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库 |
静态库 | 在编译后的执行程序不再需要外部的函数库支持,运行速度相对快些,运行效率高 | 如果所使用的静态库发生更新改变,程序必须重新编译 在编译过程中已经被载入可执行程序,因此体积较大 |