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

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

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

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文件,方便省事,不用每次都去添加参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: