gcc的-l参数,-L参数,-I参数

news/2025/3/14 16:37:34/

一、基础知识

标准库的大部分函数通常放在文件 libc.a 中(文件名后缀.a代表“achieve”,译为“获取”),或者放在用于共享的动态链接文件 libc.so 中(文件名后缀.so代表“share object”,译为“共享对象”)。这些链接库一般位于 /lib/ 或 /usr/lib/,或者位于 GCC 默认搜索的其他目录。

当使用 GCC 编译和链接程序时,GCC 默认会链接 libc.a 或者 libc.so,但是对于其他的库(例如非标准库、第三方库等),就需要手动添加。

二、-l参数(小写的 L)

GCC 的-l选项(小写的 L)可以让我们手动添加链接库。

令人惊讶的是,在Linux中,标准头文件 <math.h> 对应的数学库默认也不会被链接,如果没有手动将它添加进来,就会发生函数未定义错误。 下面我们编写一个数学程序 main.c,并使用到了 cos() 函数,它位于 <math.h> 头文件。

//main.c
#include <stdio.h>      /* printf */
#include <math.h>       /* cos */
#define PI 3.14159265int main ()
{double param, result;param = 60.0;result = cos ( param * PI / 180.0 );printf ("The cosine of %f degrees is %f.\n", param, result );return 0;
}

如果我们不使用 -l 选项:

[root@bogon demo]# gcc main.c
/tmp/ccYfkZJk.o: In function `main':
main.c:(.text+0x34): undefined reference to `cos'
collect2: ld returned 1 exit status

现在我们输入以下命令。

[root@bogon demo]# gcc main.c -o main.out -lm

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,它的库名是m,它的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。 

三、-L参数

该参数表示选择链接库的目录。

通常,GCC 会自动在标准库目录中搜索文件,例如 /usr/lib,如果想链接其它目录中的库,就得特别指明。

有三种方式可以链接在 GCC 搜索标准路径以外的链接库,下面我们分别讲解:

1) 直接指定该链接库的完整路径与文件名。

例如,如果链接库名为 libm.a,并且位于 /usr/lib 目录,那么下面的命令会让 GCC 编译 main.c,然后将 libm.a 链接到 main.o:

[root@bogon demo]# gcc main.c -o main.out /usr/lib/libm.a

2) 使用-L选项,为 GCC 增加另一个搜索链接库的目录,然后再链接so文件:

[root@bogon demo]# gcc main.c -o main.out -L /usr/lib -lm

可以使用多个-L选项,或者在一个-L选项内使用冒号分割的路径列表。

3) 把包括所需链接库的目录加到环境变量 LIBRARYPATH 中。

四、-I参数(大写的i)

-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I(大写的i)参数指定了。比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错误。

4.1 例1

gcc -o example1 example1.c  -I /usr/local/include/freetype2 -lfreetype -lm 

上面这句话在编译example1.c 时,-I /usr/local/include/freetype2 表示将/usr/local/include/freetype2作为第一个寻找头文件的目录,参数-l  (大写的i)。 

-lfreetype  ,-l  (小写的L)参数用来指定程序要链接的库-l参数紧接着就是库名。指定程序链接的库名是freetype。

-lm 表示程序指定的链接库名是m  (math数学库)。

4.2 例2

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/include

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

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

参考:

GCC -l选项:手动添加链接库

gcc -I -L -l区别_一路奔跑94的博客-CSDN博客_-i gcc

gcc的-l参数和-L参数和-include(转载) - 长缨在手_521 - 博客园


http://www.ppmy.cn/news/472892.html

相关文章

SQL*PLUS命令的使用(一)

命令不需要分号结束我们可以通过help index命令&#xff0c;来查看命令清单showdown命令可以关闭数据库实例&#xff0c;describe命令可以返回对数据库所存储对象的描述 查找oracle中有哪些用户 select username from dba_usernames1.如何解锁用户 alter user 用户名 accoun…

sqlplus 命令大全

Shell 脚本和sqlplus间的交互 有些时候我们可能需要shell脚本通过oracle的sqlplus执行一些sql,并对结果集进行相关的操作。 1、设置输出显示 SQL> show all --查看所有68个系统变量值 SQL> show user --显示当前连接用户 SQL> show error --显示错误 SQL> set s…

SQLPLUS常用命令

一.SQLPLUS登陆命令&#xff1a; 使用sqlplus&#xff1a; 10G之前的版本登陆时需要加引号&#xff08;单、双引号皆可&#xff09;如&#xff1a;sqlplus " / as sysdba" sqlplus -prelim / as sysdba 从Oracle10g开始&#xff0c;sqlplus提供了一个参数选项-…

SQL * PLUS 概述与常用命令

简介 SQL * PLUS 是用户与oracle进行交互的客户端工具。在SQL*PLUS 中&#xff0c;用户可以执行输入的SQL语句、PL/SQL 语句&#xff0c;以及各种sql *plus命令&#xff0c;还可以格式化SQL&#xff0c;PL/SQL语句的输出结果等。 SQL*PLUS的命令类型&#xff1a; SQL &#x…

sqlplus命令大全

官方联机文档 零、基本的SqlPlus命令 命令说明remark注释set headsep标题换行ttitle设置输出页的头标题btitle设置输出页的尾标题column对sql语句中的列进行格式化处理break on通知sqlplus在输出结果中插入空格compute sum通知sqlplus计算小计set linesize(line)设置sqlplus输…

ls参数大全

只列出目录下的目录&#xff1a;ls -F | grep "/" 不显示目录下的子项&#xff1a;ls -d -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文件。 -b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。 -c 输出文件的 i 节点的…

函授本科学费一共需要多少钱一年

函授本科的收费通常是报名费加上学费&#xff0c;每年的报名费大约是100-200元&#xff0c;每年的学费大约是2000-3000元。其费用以本地高校所在区域的物价为基础&#xff0c;相对于普通高校而言&#xff0c;其费用相对较低。 函授本科一年学费多少钱 函授本科学费一年2000-300…

SQL Plus 常用命令

导航 前言SQL Plus常用命令COLUMN &#xff1a; 设置字段列宽HELP&#xff1a;查看帮助DESCRIBE&#xff1a;查看表的结构&#xff08;字段&#xff09;信息SPOOL&#xff1a;将屏幕内容保存到文件中SAVE&#xff1a;将缓冲区的内容保存到sql文件中START&#xff1a;执行sql文件…