gcc “-I”(大写i),“-L”(大写l),“-l”(小写l)的区别

我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:

例:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld

上面这句表示在编译hello.c时:

-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/includ

-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib

 -lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)

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-11-09 21:55:41

gcc “-I”(大写i),“-L”(大写l),“-l”(小写l)的区别的相关文章

C#根据用户输入字符串,输出大写字母有几个,小写字母有几个

static void Main(string[] args) { // 根据用户输入字符串,输出大写字母有几个,小写字母有几个. Console.WriteLine("请输入一行英文代码"); string s = Console.ReadLine(); //用一个字符串接受输入值. int i = 0; int j = 0;// i是大写个数, j是小写个数. foreach (char s1 in s) { if (s1 >= 'A' && s1 <=

GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名

为什么会出现undefined reference to 'xxxxx'错误?首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm. -l参数和-L参数-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是l

gcc -L、-Wl,-rpath, -Wl,-rpath-link的区别

现要在目录 mainDir 下编译库libmain.so, 但是其 ---依赖于---> libsub.so,sub.so在目录 mainDir / subDir 下,且subDir不在LD_LIBRARY_PATH以及环境变量中. 现有如下执行: 1. gcc -share -o libmain.so  main.o 此命令可编译并链接通过,利用ldd libmain.so时没有发现有对libsub.so的依赖,但是ldd -r libmain.so时会发现会有sub库中的函数出现undefi

css之文本缩进 | 文本对齐 | 上划线 | 下划线 | 删除线 | 首字母大写 | 全部变大写 | 全部变小写

1.文本缩进: 举例: 如果是整个段落缩进: 要实现下面的效果: -40px 2.文本对齐: 举例: 3.文本装饰: 举例: 删除线: 4.文本变形: 举例: 全部变大写: 全部变小写:

二、java语法基础

这里提几个个人感觉需要注意的细节,具体的内容推荐随便看本java书籍 一.标识符 1.标识符命名规则:1)字母.下划线.美元符号或者数字组成2)字母.下划线.美元符号开头(不能是数字)(面试喜欢考这两点)3)大小写敏感,长度无限制4)不能和关键字.保留字重名2.约定一般采用驼峰规则,并且是见名知意3.注意命名不能够有关键字 所有关键字,都是小写字母 二.基本数据类型 byte,short ,int,long,char:  boolean :float,double 需要注意的是: 1)整型默认使

常用包管理三类工具:dpkg、apt和aptitude

常用的包管理包含三类工具:dpkg.apt和aptitude.人们总是对前面的两个工具用得比较多,而对 aptitude 用得比较少,事实上 aptitude 是很强大的. 在这里,对这三个工具做一点总结. dpkg 主要是对本地的软件包进行管理,本地软件包包括已经在本地安装的软件包和已经下载但还没有安装的 deb 文件,不解决依赖关系. apt 包含了很多工具,apt-get 主要负责软件包的在线安装与升级,低层对 deb 包的处理还是用的 dpkg,解决依赖关系:apt-cache 主要用来

javascript 知识点梳理 -- 整理自广州传智王老师

Javascript Javascript中的数据类型 在JavaScript中一共有六种数据类型: 1)String   :字符串类型,在JavaScript中可以通过双引或单引括起来 2)Number  :数值类型,在JavaScript是没有整形与浮点型之说的,所有的数值类型都属于Number类型,10  10.88  5.66 3)Boolean  :布尔类型,其值可以是true或false 4)Undefined :变量有声明,但未赋值 5)Null      :空类型 6)Objec

五天 js

JavaScript 一. 简介 Web开发: 1. 静态 Html Css Javascript 2. 动态 Asp Jsp Php 由客户端浏览器解析并执行--à静态的 由服务端解析并运行--à动态的 因为js由客户端浏览器解析并执行,所以不同的浏览器在对js进行解析时可能会有差异 IE 火狐 3. 什么是javascript l JavaScript 是网景(Netscape)公司开发的一种基于客户端浏览器.面向(基于)对象.事件驱动式的网页脚本语言. 4. 主要功能 l 交互式操作 l 

8种最好的Linux密码管理器

推荐8种最好的Linux密码管理器,可以安全地存储你的登录信息. ·Fiagaro's Password Manager·Gpass·Gpassword Manager·Gringotts·KeePassX·MyPasswords·PasswordSafe·Revelation 除了记得Fedora 13虚拟机的登录信息,您还记得1999年你放弃的Angelfire上站点的账户和密码吗?当时,我们都在上面. 这是福尔摩斯称为填充的阁楼无用的信息.我们不能够清理东西从我们的阁楼,但我们可以信任的一