c++ 编译运行时的库链接问题

今天在写\(c\)++代码时,因为写了一个\(Brass\)类和\(BrassPlus\)类,类的声明写在了 \(brass.h\)文件中,但是类实现写在了\(brass.cpp\)文件中,后面写了一个\(usebrass1.cpp\)文件使用了这两个类竟然无法编译。

后来把类实现和声明都写进了\(brass.h\)中竟然通过了编译!
思考了半天想到可能需要将\(brass.cpp\)作为动态库或者静态库编译\(usebrass1.cpp\)时链接进来即可。

动态库方法

首先使用g++ brass.cpp -fPIC -shared -o libbrass.so命令生成 名为\(libbrass.so\)的动态库,注意动态库的名字必须具有前缀 \(lib\),然后直接运行即可:g++ usebrass1.cpp -L. -lbrass
\(-L\)后面需要跟上所需库的路径,这里使用相对路径
\(-l\)后面跟上链接库的库名,注意这里不需要前缀\(lib\)和后缀名\(.so\),直接写\(brass\)即可。
\(-I\)后面要跟上所需头文件的搜索路径,这里没用到。
接下来直接运行即可:

静态库方法

首先需要生成\(.o\)文件,g++ -c brass.cpp,生成名为\(brass.o\)的ELF文件格式的可执行文件,然后使用归档命令ar -r libbrass.a brass.o,将\(brass.o\)加入到静态库\(libbrass.a\)中,最后使用编译命令g++ usebrass1.cpp libbrass.a -L.编译时链接即可。

总结

静态库(.a)文件:程序在编译链接的时候把库的代码直接链接到可执行文件中,程序运行的时候就不再需要静态库
动态库(*.so)文件:程序在运行的时候才会链接库的代码。

静态库具有移植性强的特点但是多次使用就会有多份冗余拷贝,并且对程序的更新、部署和发布会带来麻烦,如果静态库有更新,那么所有使用它的程序都需要重新编译、发布。
动态库系统只需要载入一次,不同的程序可以得到内存中相同动态库的副本,因此节省了很多内存,但是相应的可移植性较差。

posted @ 2021-09-16 22:48  !^^!  阅读(165)  评论(0编辑  收藏  举报