如果希望把源码 file1.c、flle2.c、...fileN.c 做成库文件,我们可以分别通过下面命令把他们制作成静态库或动态库:
静态库:
gcc -c file1.c
gcc -c file2.c
...
gcc -c fileN.c
此时会生成file1.o,file2.o ... fileN.o文件
ar -rcs libname.a file1.o file2.o ... fileN.o
生成 libname.a 文件 即静态库文件。
- 静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,windows和linux下都是后缀用”.a”,“xxx”为静态库名,windows下的静态库名也叫libxxx.a;
- 链接时间: 静态库的代码是在编译过程中被载入程序中。
- 链接方式:静态库的链接是将整个函数库的所有数据都整合进了目标代码。这样做优点是在编译后的执行程序不在需要外部的函数库支持,因为所使用的函数都已经被编进去了。缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译
动态库:
gcc -shared -fPIC -o libname.so file1.c file2.c ... fileN.c
生成libname.so文件
- 动态库的命名方式与静态库类似,前缀相同为“lib”,linux下后缀名为“.so(shared object)”即libxxx.so;而windows下后缀名为“.dll(dynamic link library)”即libxxx.dll;
- 链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响你的程序,所以动态函数库升级比较方便
使用静态库或动态库连接编译:
编译时找不到函数的定义,这是要通过 -l+库文件名 来指定编译所需的库文件(注:库文件名为libname.so文件中的 name)。
这时,显示在/usr/bin/ld目录下没有找到 crc-t 库文件,这是因为链接器在链接时默认到系统动态库路径(/lib、/lib64、/usr/lib) 下查找相应的库文件。如果没找到就报错。可以通过 -L选项来指定的 查找库的路径。
Makefile文件:
1 crc=crc_itu_t //源文件 2 cc=gcc 3 headfile_path=/home/iot/dingxi/headfile/ //指定头文件路径 4 lib_path=/home/iot/dingxi/lib/ //指定库文件路径 5 6 target: 7 ${cc} -shared -fPIC -o libtem.so ${crc}.c -I ${headfile_path} //生成动态库 8 9 client: 10 ${cc} tlvcli.c -o cli -I ${headfile_path} -lcec_t -L${lib_path} //连接库编译 11 server: 12 ${cc} sertlv.c -o ser -I ${headfile_path} -lcec_t -L${lib_path} 13 clear: 14 rm *.o 15 16 makefile