Linux下的静态库的后缀为a,动态库后缀为o。与之对应的windows下静态库后缀为lib,动态库后缀为obj。
有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc 就是这样一个库,我们在不同的程序中都会用到libc 中的库函数(例如printf)。
打包成一个静态库libmy.a的命令是 :
1 2 |
$ <span style="color: #c20cb9; font-weight: bold;">ar</span> rs libmy.a a.o b.o c.o <span style="color: #c20cb9; font-weight: bold;">ar</span>: creating libmy.a |
库文件名都是以lib 开头的,静态库以.a作为后缀,也可以使用下面的命令打包:
1 2 |
$ <span style="color: #c20cb9; font-weight: bold;">ar</span> r libmy.a a.o b.o c.o $ ranlib libmy.a |
然后我们把libmy.a 和main.c编译链接在一起:
1 |
$ <span style="color: #c20cb9; font-weight: bold;">gcc</span> main.c -L. -lmy <span style="color: #660033;">-o</span> main |
-L选项告诉编译器去哪里找需要的库文件,-L. 表示在当前目录找。-lmy告诉编译器要链接libmy 库。注意,即使库文件就在当前目录,编译器默认也不会去找的,所以-L.选项不能少。
还有一点是要注意的, 编译器会首先找有没有共享库libmy.so,如果有就链接它,如果没有就找有没有静态库libmy.a ,如果有就链接它。所以编译器是优先考虑共享库的,如果希望编译器只链接静态库,可以指定-static选项。
链接共享库和链接静态库的区别:
在链libc 共享库时只是指定了动态链接器和该程序所需要的库文件,并没有真的做链接,可执行文件main 中调用的libc 库函数仍然是未定义符号,要在运行时做动态链接。而在链接静态库时,链接器会把静态库中的目标文件取出来和可执行文件真正链接在一起。而且链接器可以从静态库中只取出需要的部分来做链接。
转载请注明:爱开源 » Linux下的静态库和动态库