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

转自: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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值