您的位置:首页 > 运维架构 > Linux

linux下g++ 编译时动态库和静态库的链接和头文件问题

2018-03-30 09:35 507 查看
转自:https://blog.csdn.net/shitangdejiaozi/article/details/51028938

原来编译的时候都是用的很随意,没用系统的总结一下,这几天在编译的时候遇到一些下问题,于是就总结一下,省得过几天又给忘了。


1.动态库和静态库简介

静态库在程序链接的时候会自动的链接到程序里,所以一旦编译完成,静态库就不需要了,静态库以.a结尾。 

动态库在编译时不会被连接到目标代码中,而是在程序运行时才被载入,动态库以.so结尾。 

静态库相对于动态库来说更高的效率,但是消耗更多的空间。


2.动态库的使用

Linux下,编译时要搜索动态库的路径,查找顺序为: 

假设动态库文件libmyfoo.so在目录home/lib/mylib中。 

1,编译目标代码时指定的动态库 搜索路径 

g++ -o test test.cpp /home/lib/mylib/libmyfoo.so 

或者 g++ -o test test.cpp -L /home/lib/mylib/ -lmyfoo 

-l 和-L的意思在下面会具体解释。 

2,环境变量LD_LIBRARY_PATH指定的动态库搜索 

在即将运行编译指令的终端下执行: 

export LD_LIBRARY_PATH=/home/lib/mylib 

然后再运行g++ -o test test.cpp -lmyfoo 

但是这种方法具有临时性,当你关闭此终端,就失效了,我们可以在~/.bashrc 中加入:export LD_LIBRARY_PATH=$LD_LIBRARAY_PATH:/home/lib/mylib 

这样每次打开终端都要进行配置。 

3,在/etc/ld.so.conf中指定动态库路径 

在文件中加入一行:/home/lib/mylib 将自己的目录加入到系统的共享目录中。然后ldconfig来刷新共享库缓存。 

4,/lib 

把你的.so文件复制到/lib目录下就能找到了 

5,/usr/lib 

上面是查找动态库的顺序,当然也是我们使用动态库的方法,使用哪种都可以。 

对于静态库,使用第一种方法 

g++ -o test test.cpp /home/lib/mylib/libmyfoo.a 

或者 

g++ -o test test.cpp -L /home/lib/mylib -lmyfoo 
#### -l -L 的说明 

-l 参数就是用来指定程序要链接的库,-l参数紧接着是库名, 

库名和库文件名有什么不同呢? 

库文件名:libmyfoo.so 

库名:myfoo 把库文件名的头lib和尾.so去掉就是库名了 

放在/lib 和/usr/lib 和/usr/local/lib里的库直接用-l参数就能链接了,如果库文件没有在这三个目录里,就需要-L 比如上面的例子:g++ -o test test.cpp -L/home/lib/mylib -lmyfoo 

-L 后面跟的是库文件所在目录,再加上-l库名


3.头文件

/usr/include 目录中的头文件编译器能够自己知道,如果是其他目录下,需要使用-I参数来指定头文件目录。 

g++ -o test test.cpp -I /myinclude 

你也可以在文件中 #include “myclude/test.h” 

以上这些在使用的使用最好是使用makefile文件,方便省事,不用每次都去添加参数。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shitangdejiaozi/article/details/51028938
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐