当前位置:网站首页>gcc -l参数和-L参数的区别
gcc -l参数和-L参数的区别
2022-07-24 11:39:00 【小原小原吃汤圆】
-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。
好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。
放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest
另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,
如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so
手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如
gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出"-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic
-lgmodule -lglib -ldl -lXi -lXext -lX11 -lm",这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了–libs参数外还有一个参数是–cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config --libs --cflags,看看输出结果
现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个xxxx-config --libs --cflags,比如编译一个gtk程序:gcc gtktest.cgtk-config --libs --cflags这样就差不多了。注意`不是单引号,而是1键左边那个键。
-include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。
边栏推荐
- Talk about software testing - automated testing framework
- Is there any charge for PDF processing? impossible!
- Jmeter-While控制器
- How to go from functional testing to automated testing?
- [golang] golang implements the post request to send form type data function
- MOS tube - Notes on rapid recovery application (I) [principle]
- 【Markdown语法高级】让你的博客更精彩(四:设置字体样式以及颜色对照表)
- This is the right way for developers to open artifact!
- Database operation through shell script
- HCIP OSPF接口网络类型实验 第四天
猜你喜欢

Linked list - 142. Ring linked list II

Video playback | how to become an excellent reviewer of international journals in the field of Geoscience and ecology?
什么是云原生,云原生技术为什么这么火?

链表——剑指offer面试题 02.07. 链表相交

Is there any charge for PDF processing? impossible!

IT圈中的Bug的类型与历史

One week's wonderful content sharing (issue 13)

ctfshow ThinkPHP专题 1

Semaphore details

生信周刊第37期
随机推荐
stream流
Cgo+gsoap+onvif learning summary: 9. Go and C conduct socket communication and onvif protocol processing
HCIP MGRE实验 第三天
The third day of hcip mGRE experiment
16 tips for system administrators to use iptables
Simply use MySQL index
Collision, removal and cleaning
【Markdown语法高级】让你的博客更精彩(四:设置字体样式以及颜色对照表)
生信周刊第37期
PDF处理还收费?不可能!
Shell script
08 [AIO programming]
Imeta view | is short reading long amplicon sequencing applicable to the prediction of microbiome function?
Repeated calls, messages, idempotent schemes, full collation
scrapy-redis写项目备忘
LogBack & MDC & a simple use
链表——剑指offer面试题 02.07. 链表相交
[golang] golang implements MD5 encryption function
[QNX Hypervisor 2.2用户手册]9.2 cmdline
Fiddler packet capture tool summary