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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)文件:程序在运行的时候才会链接库的代码。

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

Code will change the world !

以上是关于c++ 编译运行时的库链接问题的主要内容,如果未能解决你的问题,请参考以下文章

C++ 解释器/控制台/片段编译器

链接使用不同版本的 gcc 编译的库

尝试在 Linux 上运行 OpenGL,拥有必要的库但无法运行? (C++)[重复]

运行时的 C++ 字符串文字转换 [关闭]

C++ 从指针构造

函数调用时的 C 到 C++ 错误