Linux gcc编译程序时,-I(大写 i )、-L (大写 L)、-I(小写 L )的作用与区别

gcc编译程序时,-I(大写 i )、-L (大写 I)、-I(小写 I )的作用与区别

1.问题描述

在进行程序编译,有时稍微复杂一点的程序就会使用到库,并且就会去配置一些环境变量,这段时间这点学得有点混乱,所以做个总结区分这三个标志。

2. -I (大写i)

include头文件非标准库中存在的也不是在当前文件夹下的,需要将地址用-i(大写)包含

例如:

gcc -o face baidu_http.c -I /home/hello/include -lcurl -lssl -lcrypto

上面这句指令在编译baidu_http.c时:

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

3. -L(大写 L)

放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so.
这时另外一个参数-L就派上用场了,比如curl库,它在/home/pi/curl/lib目录下,我们编译时就要用

 -L /home/pi/curl/lib -lcurl

-L参数跟着的是库文件所在的目录名。

总得来说:编译程序按照-L指定的路进去寻找库文件,一般的在-L的后面可以一次用-l指定多个库文件。

4.-l(小写L)

  1. -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名
  2. 表示在上面的lib的路径中寻找libxxx.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libxxx.a静态库文件)
  3. 编译程序到系统默认路径搜索,如果找不到,到当前目录,如果当前目录找不到,则到LD_LIBRARY_PATH等环境变量配置的路径去查找,如果还找不到,那么编译程序提示找不到库。

注意:数学库的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了

<think>我们正在讨论Makefile中的编译选项,特别是-I和-L的区别。根据用户的问题,他明确想了解这两个选项的区别。注意,用户的问题中引用了多个站内引用,这些引用已经解释了-I(大写i)用于指定头文件搜索路径,-L(大写L)用于指定库文件搜索路径。我们需要在此基础上给出清晰的解释。 首先,回顾一下用户提供的引用内容: 引用[1]:指出Makefile中-I(大写i)、-l(小写L)和-L(大写L)的区别,并提到Makefile对大小写敏感。 引用[2]和[3]:举例说明gcc命令中-I、-L和-l的用法: -I目录:指定头文件搜索目录,优先级从高到低:指定目录 -> 系统目录(/usr/include等)。 -L目录:指定库文件搜索目录,优先级从高到低:指定目录 -> 系统目录(/lib, /usr/lib等)。 -l库名:在指定的库目录中寻找特定的库文件(如-lworld会寻找libworld.so或libworld.a)。 引用[4]:同样强调-L用于指定库文件搜索目录。 因此,我们可以这样总结: -I(大写i):用于在编译阶段指定头文件(.h文件)的搜索路径。 -L(大写L):用于在链接阶段指定库文件(如.so或.a文件)的搜索路径。 注意:-l(小写L)用于指定具体的库名称,它依赖于-L指定的路径来查找库。 现在,我们按照用户的要求,用中文回答,并确保结构清晰。同,我们还需要生成相关问题。 回答结构: 1. 分别解释-I和-L的作用,强调它们的不同使用阶段(编译阶段和链接阶段)。 2. 给出示例说明。 3. 总结两者的区别。 4. 生成相关问题。 注意:用户要求使用$...$格式的行内数学表达式,但这个问题不涉及数学表达式,所以我们可以不使用数学表达式。但是如果有需要,我们可以用$...$来举例路径,比如将路径名用$...$括起来(虽然不必要,但为了遵循指令,可以适当使用)。不过,这个问题更注重于解释,所以我们可以不使用数学表达式,或者用简单的变量表示即可。 另外,用户要求生成相关问题,放在最后。 下面开始回答: </think>### Makefile中 `-I` 和 `-L` 的区别详解 在Makefile中,`-I` 和 `-L` 是两类不同的预处理指令,分别控制编译器在**编译阶段**和**链接阶段**的搜索路径: #### 1. **`-I`(大写i): 头文件搜索路径** ```makefile CFLAGS += -I/path/to/headers ``` - **作用**:指定编译器查找头文件(`.h`)的**优先级目录** - **搜索顺序**: ``` /path/to/headers → /usr/include → /usr/local/include ``` - **示例**:`-I$(STAGING_DIR)/usr/include` 优先在此目录查找 `ubox.h` 等文件 - **阶段**:仅在**编译阶段**生效(处理 `#include` 指令)[^1][^2] #### 2. **`-L`(大写L): 库文件搜索路径** ```makefile LDFLAGS += -L/path/to/libs ``` - **作用**:指定链接器查找库文件(`.so`/`.a`)的**优先级目录** - **搜索顺序**: ``` /path/to/libs → /lib → /usr/lib → /usr/local/lib ``` - **示例**:`-L$(STAGING_DIR)/usr/lib` 优先在此目录查找 `libubox.so` - **阶段**:仅在**链接阶段**生效(处理 `-lxxx` 参数)[^2][^3] #### 3. **对比总结** | 参数 | 作用对象 | 处理阶段 | 典型用法示例 | 最终查找目标 | |------|----------------|----------|----------------------------|-----------------------| | `-I` | 头文件(`.h`) | 编译阶段 | `-I$(INCLUDE_PATH)` | `stdio.h`, `ubus.h` | | `-L` | 库文件(`.so`/`.a`) | 链接阶段 | `-L$(LIBRARY_PATH)` | `libubox.so`, `libc.a` | > **关键区别**:`-I` 影响源代码的**预处理**,`-L` 影响二进制文件的**链接过程**。两者通常配合 `-l`(小写L)使用: > ```makefile > gcc main.c -I/custom/include -L/custom/lib -lmylib > ``` > 该命令表示: > 1. 在 `/custom/include` 查找 `mylib.h` > 2. 在 `/custom/lib` 查找 `libmylib.so`[^2][^4] #### 4. **应用场景示例** ```makefile # 交叉编译嵌入式程序 CC = arm-linux-gnueabihf-gcc CFLAGS += -I$(STAGING_DIR)/target/include # 优先目标平台头文件 LDFLAGS += -L$(STAGING_DIR)/target/lib # 优先目标平台库文件 LDFLAGS += -lubus -lubox # 链接特定库 app: app.o $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) ``` 此配置确保: 1. 编译使用目标平台的 `ubus.h`(而非开发机系统头文件) 2. 链接使用目标平台的 `libubus.so`[^3][^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值