C++学习(三四二)静态库 动态库

Posted hankern

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++学习(三四二)静态库 动态库相关的知识,希望对你有一定的参考价值。

库只是对象的集合,根据定义,这些对象尚未链接.链接器不用于创建库,因此,没有链接器选项是有道理的.

静态库不做符号链接判断

动态库做

动态库在生成时提示undefined reference to `curl_easy_init'

静态库不提示

静态库引用动态库,不要把动态库加入,在使用静态库时加入动态库

最后发现是因为我在生成静态库时把该静态库依赖的库也加上了,如下

ar -r libzlog.a format.o level.o  -lpthread

其中-lpthread是不能写在这的,这句话应该改成ar -r libzlog.a format.o level.o,最后谁用libzlog.a谁添加-lpthread

编译静态库时只有编译过程,没有链接过程,静态库引用其它库并不会在编译的时候把引用的库函数编译到生成的 lib 中,只是简单的将编译后的中间文件打包,在编译最终的可执行项目(.exe 和 .dll)的时候,需要引用所有的库,进行符号消解。如果你需要封装,使用动态库。

静态库在编译、链接时是不需要动态库so的,也就是能生成.a静态库文件。

如果有静态库libXXX.a,它有个函数叫testFunc(),该函数用了其他的动态库的函数,比如libAA.so的AA()函数,libBB.so的BB()函数,libCC.so的CC()函数,那么,该libXXX.a对这些动态库的调用仍是动态调用,而不是把动态库的相关函数copy到自己身上。

任何其他程序,想用libXXX.a,链接时都需要链接libXXX.a所依赖的动态库。 

至于程序跑起来时,动态库是否要在现场?这个就跟编译程序加不加-static有关系了。 

如果你要写的静态库libXXX.a是完全独立的,比如里面只有一些数学运算,不依赖与其他动态库,那静态库挺好的,任何用他的程序,只需要链接时用到,程序跑起来,就不需要它在现场了!

但是,如果你要写的库,依赖很多其他的库,那你还是改写成动态库吧!否则,作为写其他程序的人,如果要用你的库,那写Makefile时,还得知道你到底依赖了什么动态库,否则编译都编译不过,多痛苦啊!!!

以上是关于C++学习(三四二)静态库 动态库的主要内容,如果未能解决你的问题,请参考以下文章

C++学习(四四二)cmake ninja build.ninja rules.ninja

C++学习(二五零)动态库和静态库的选择顺序

C++学习(三七七)Makefile 动态库 静态库

C++学习(三六七)configure动态库 静态库

C++学习(三八四)libtool动态库 静态库

C++学习(四九零)add_library生成动态库和静态库