gcc -l -L -I -include 参数

gcc -l参数和-L参数

-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.c `gtk-config --libs --cflags`这样就差不多了。注意`不是单引号,而是1键左边那个键。

5、-include和-I参数

-include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。

时间: 2024-10-18 17:50:52

gcc -l -L -I -include 参数的相关文章

【C++编译】gcc的-l参数和-L参数

今天在编译服务的时候,出现了一个错误: /usr/bin/ld: cannot find -lxxx 于是查了一下,这个错误是因为链接程序ld在指定目录里找不到libxxx.so这个库. 那么,上面所说的"指定目录"是哪些目录,以及 -l的作用是什么呢? -l参数:用来指定程序要链接的库,-l参数紧接着就是库名.这里的库名并非真正的库文件名.以库名为math的库为例,他的库文件名是libmath.so或者libmath.a(Linux下的库文件都要以lib开头,其中.so是动态库,.a

使用gcc的-l参数的时候,怎么查找函数所在库的位置

键盘输入一个整数n,接着输入n个实型数,分别求取这n个实型数的平方根.代码如下: 使用gcc编译,报错如下: 原因是没有链接数学库,加上-lm即可,-l是链接,m是数学库(math.h) 那我们怎么知道sqrt在哪个库呢? centos7下使用: nm -Do /lib64/*.so|grep sqrt 结果为: /lib64/libm-2.17.so就是sqrt的动态链接库的位置, 找到后,只要gcc的-l参数后面加上上图中lib后面的那个字母即可,libm-2.17.so中m表示库名,2.1

GCC 中 -L、-rpath和-rpath-link的区别

GCC 中 -L.-rpath和-rpath-link的区别 来源 http://blog.csdn.net/q1302182594/article/details/42102961 关于这3个参数的说明,有不少资料,但是看完了还是觉得模糊,分不清它们的区别.本文将用实验的方法去探讨这3个参数的区别. 1.三个.c文件 1.1 world.c #include<stdio.h> void world(void) { printf("world.\n"); } 1.2 hel

数据结构顺序表中Sqlist *L,&amp;L,Sqlist *&amp;L

//定义顺序表L的结构体 2 typedef struct 3 { 4 Elemtype data[MaxSize]: 5 int length; 6 }SqList; 7 8 //建立顺序表 9 void CreateList(SqList * &L,ElemType a[ ],int n) 10 { 11 int i; 12 L = (SqList * )malloc(sizeof(SqList)); 13 for(i = 0 ; i < n ; i++) 14 L->data[i

SSH远程登录、.sh文件后缀运行、l l命令结果说明、VIM模式切换

目录 SSH远程登录..sh文件后缀运行.l l命令结果说明.VIM模式切换 SSH远程安全登录 .sh文件后缀运行 l l命令结果说明 VIM模式切换 SSH远程登录..sh文件后缀运行.l l命令结果说明.VIM模式切换 SSH远程安全登录 SSH为网络协议,专门为远程登录会话和其他网络服务提供安全性的协议,用于在计算机之间的加密登录,对数据进行加密. SSH主要用于远程登录,主要有口令登录和公钥登录,现简单说下口令登录基本用法: #使用root账户登录远程主机 默认端口是22 可以修改端口

D?e?p?l?o?y?m?e?n?t? ?f?a?i?l?u?r?e? ?o?n? ?T?o?m?c?a?t? ?6?.?x?.? ?C?o?u?l?d? ?n?o?t? ?c?o?p?y? ?a?l?l? ?r?e?s?o?u?r?c?e?s? ?t?o

在myeclipse总部署项目,一直有问题,提示如下的错误,经过研究在网上需求帮助,解决方案如下: Deployment failure on Tomcat  6.x. Could not copy all resources to D: \Program Files\apache-tomcat-6.0.16\webapps\fuNan_conv. If a file is loc ked, you can wait until the lock times out to redeploy, o

s?h?e?l?l?中?条?件?判?断?i?f?中?的?-?z?到?-?d?

shell中条件判断if中的-z到-d的意思 2011-09-05 10:30 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ -d FILE ] 如果 FILE 存在且是一个目录则为真. [ -e FILE ] 如果 FILE 存在则为真. [ -f FILE ] 如果 FILE 存在且是一个普通文件则为真. [ -g FILE ] 如果 F

GCC选项 &ndash;I,-l,-L

-I:指定第一个寻找头文件的目录 -L:指定第一个寻找库文件的目录 -l:表示在库文件目录中寻找指定的动态库文件 例: gcc –o hello hello.c –I /home/hello/include –L /home/hello/lib –lworld /home/hello/include 作为第一个头文件的寻找目录.头文件寻找顺序:/home/hello/include –> /usr/include –> usr/local/include /home/hello/lib 作为第

gcc和ld 中的参数 --whole-archive 和 --no-whole-archive

首先 --whole-archive 和 --no-whole-archive 是ld专有的命令行参数,gcc 并不认识,要通gcc传递到 ld,需要在他们前面加 -Wl,字串. --whole-archive 可以把 在其后面出现的静态库包含的函数和变量输出到动态库,--no-whole-archive 则关掉这个特性. 比如你要把 liba.a  libb.a libc.a 输出到 libabc.dll(或libabc.so)时应该这么写: libabc.dll:liba.c libb.a