Makefile 生成(动)静态库文件

 如果希望把源码 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;
  • 链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响你的程序,所以动态函数库升级比较方便

 

使用静态库或动态库:

gcc main.c -o myapp -L lib_path -lname

 

使用静态库或动态库连接编译:

编译时找不到函数的定义,这是要通过 -l 来指定库函数

这时,显示在/usr/bin/ld目录下没有找到 crc-t 库文件,这是因为链接器在链接时默认到系统动态库路径(/lib、/lib64、/usr/lib) 下查找相应的库文件。如果没找到就报错。可以通过 -L选项来指定的 查找库的路径。

猜你喜欢

转载自www.cnblogs.com/amateur-writer-2019-1-12/p/10639763.html
今日推荐