C语言如何编译动态库与静态库?
关于动态库与静态库的作用这里就不在详细赘述了,重点说一下如何编译动态库与静态库及使用,一些大型的程序一般拥有着良好的架构,各个功能模块之间能够相互协调工作,达到预期的效果,但有的程序并不是所有的源码都是自己编写,特别像是用到芯片厂商的提供的库;能够把这些融合起来的就是需要提供的库;
原料:test1.c test2.c main.c
(详细的代码不再详细列出来,大家都是开发者,都希望用最短的时间找到想找的东西,而不是浪费太多的时间在细枝末节上)
1.如何编译动态库
gcc test1.c test2.c -shared -fPIC -o libtest.so
使用动态库
gcc main.c -L. -ltest -o a.out
(
-L : 表示需要库的路径
-l:表示需要库的名称,如libtest.so,名称则为test
)
(ps:执行a.out时有可能提示找不到libtest.so文件,这时需要把库文件放入到/lib等目录下,或者添加环境变量LD_LIBRARY_PATH,包含有库文件的路径即可)
2.如何编译静态库
gcc -c test1.c test2.c
ar -r libtest.a test1.o test2.o
使用静态库
gcc main.c -static -L. -ltest -o a.out
(
-static:可强制编译时使用静态库,如果不使用这个参数,而静态库与动态库同名的话,会优先使用动态库
)
3.静态库与动态库
在可执行程序执行条件上,使用静态库编译时,生成的执行文件就不再依赖.a静态库文件,而使用动态库编译的执行文件必须包含.so库文件才能运行;
在可执行程序的执行速度上,静态编译的文件会优于动态编译(毕竟静态编译把库文件的代码都编译到执行文件,与动态编译不同在执行动态库中函数时才会去路径下的动态库中寻找链接);
在可执行程序的大小上,静态编译后的文件大小比动态编译的文件大很多;如果对内存要求较高的可选择用动态编译,虽然会慢一点;
在修改库之后,静态编译的文件需要再把静态库和原main.c文件都重新编译才能使用,而动态编译的文件不需要再编译main.c,只需要把新编译的动态库覆盖原来的动态库,再重新运行可执行文件即可生效;相比于编译一个大型工程需要一两小时,动态库的优势就不必多言了;