当前位置:   article > 正文

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

-l -l 链接静态库 不编译源文件

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

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://www.wpsshop.cn/w/从前慢现在也慢/article/detail/201082
推荐阅读
相关标签
  

闽ICP备14008679号