赞
踩
原来编译的时候都是用的很随意,没用系统的总结一下,这几天在编译的时候遇到一些下问题,于是就总结一下,省得过几天又给忘了。
静态库在程序链接的时候会自动的链接到程序里,所以一旦编译完成,静态库就不需要了,静态库以.a结尾。
动态库在编译时不会被连接到目标代码中,而是在程序运行时才被载入,动态库以.so结尾。
静态库相对于动态库来说更高的效率,但是消耗更多的空间。
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库名
/usr/include 目录中的头文件编译器能够自己知道,如果是其他目录下,需要使用-I参数来指定头文件目录。
g++ -o test test.cpp -I /myinclude
你也可以在文件中 #include “myclude/test.h”
以上这些在使用的使用最好是使用makefile文件,方便省事,不用每次都去添加参数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。