C语言头文件路径剖析

在一个软件项目中,如果需要在一个文件中包含另一个头文件时,一般有两种包含方式:

 

#include <stdio.h>#include “module.h”

如果你引用的头文件是标准库的头文件或官方路径下的头文件,一般使用尖括号 <> 包含;如果你使用的头文件是自定义的或项目中的头文件,一般使用双引号 "" 包含。头文件路径一般分为绝对路径和相对路径:绝对路径以根目录 / 或者Windows下的每个盘符为路径起点;相对路径则是以程序文件当前的目录为起点。

​​​​​​​

#include ”/home/wit/code/xx.h”  //Linux下的绝对路径#include “F:/litao/code/xx.h"   //Windows下的绝对路径#include ”../lcd/lcd.h”         //相对路径,..表示当前目录的上一层目录#include ”./lcd.h”             //相对路径,.表示当前目录#include ”lcd.h”               //相对路径,当前文件所在的目录

编译器在编译过程中会按照这些路径信息到指定的位置去查找头文件,然后通过预处理器作展开处理。在查找头文件的过程中,编译器会按照默认的搜索顺序到不同的路径下面去搜索,以 #include <xx.h> 为例,当我们使用尖括号 <> 包含一个头文件时,头文件的搜索顺序为:

• 通过GCC参数 gcc-I 指定的目录(注:大写的 i)

• 通过环境变量 CINCLUDEPATH 指定的目录

• GCC 的内定目录

• 搜索规则:当不同目录下存在相同的头文件时,先搜到那个使用哪个,搜索停止

当我们使用双引号 “” 来包含头文件路径时,编译器会首先到项目当前目录去搜索需要的头文件,在当前项目目录下面搜不到,再到其他指定的路径下面去搜索:

•  项目当前目录

•  通过 GCC 参数 gcc-I 指定的目录

•  通过环境变量 CINCLUDEPATH 指定的目录

•  GCC 的内定目录

•  搜索规则:当不同目录下存在相同的头文件时,先搜到那个使用哪个

 

在编译程序时,如果我们的头文件没有放到官方路径下面,我们可以通过 gcc -I 来指定头文件路径,编译器在编译程序时,就会到用户指定的路径目录下面去搜索该头文件。如果你不想通过这种方式,也可以通过设置环境变量来添加头文件的搜索路径。在 Linux 环境下我们经常使用的环境变量有:

•  PATH: 可执行程序的搜索路径

•  C_INCLUDE_PATH: C语言头文件搜索路径

•  CPLUS_INCLUDE_PATH: C++头文件搜索路径

•  LIBRARY_PATH: 库搜索路径

 

我们可以在一个环境变量内设置多个头文件搜索路径,各个路径之间使用冒号:隔开。如果你想每次系统开机,这个环境变量设置的路径信息都生效,可以将下面的 export 命令添加到系统的启动脚本::~/.bashrc文件中。

 

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/path1:/path2

 

除此之外,我们也可以将头文件添加到 GCC 内定的官方目录下面。编译器在上面指定的各种路径下面找不到对应的头文件时,最后会到 GCC 的内定目录下面去寻找。这些目录是 GCC 在安装时,通过 --prefex 参数指定安装路径时指定的,常见的内定目录有:

​​​​​​​

/usr/include/usr/local/include/usr/include/i386-linux-gnu/usr/lib/gcc/i686-linux-gnu/5/include/usr/lib/gcc/i686-linux-gnu/5/include-fixed/usr/lib/gcc-cross/arm-linux-gnueabi/5/include

 

接下来我们做一个实验,看看实际情况跟上面说得是否一致:我们创建多个头文件module.h,分别将其放置到不同的目录下,在main()函数中分别#include这个头文件,观察程序的运行结果。

 

# mkdir /home/test# cd test# touch main.c module.h

 

main.c源文件的代码如下:

​​​​​​​

// main.c#include <stdio.h>#include "module.h"int main (void){    printf("NUM = %d\m, NUM");    return 0;}
//#module.h#define NUM 10

 

在module.h中分别定义一个宏:NUM,然后将这个头文件拷贝到不同的目录下:

  • 将NUM定义为10,拷贝到/home/test目录下

  • 将NUM定义为20,将module.h拷贝到/usr/include目录下

  • 将NUM定义为30,将module.h拷贝到//usr

 

实验过程:

  • 只保留/home/test/module.h头文件,main.c中使用#include <module.h>,观察程序的编译运行结果

  • 只保留/home/test/module.h头文件,main.c中使用#include "module.h",观察程序的编译运行结果

  • 将module.h拷贝到/home/test、/usr/include目录下,分别定义为10、20,观察程序的运行结果

  • 将module.h拷贝到/usr/include目录下,main.c中使用#include "module.h",观察程序的运行结果

 

这一轮实验做下来,相信大家已经对头文件的搜索路径、搜索顺序就有了一个清晰的认识了。本文摘自《嵌入式C语言自我修养》9.4.6节:

 

C/C++ 头文件讲解:

https://www.bilibili.com/video/BV1QE411y7v4?p=8

  • 20
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Vilib是一个基于C++的视频和图像处理库,不是专门用于C语言的。不过,你可以使用C++编写代码来调用vilib库来读取图像。以下是一个读取图像的示例代码: ```cpp #include <vilib/vilib.hpp> #include <iostream> int main() { // 读取图像 vilib::Image image = vilib::Image::from_file("path/to/image.jpg"); // 打印图像信息 std::cout << "width: " << image.width() << " height: " << image.height() << std::endl; // 获取像素值 for (int y = 0; y < image.height(); ++y) { for (int x = 0; x < image.width(); ++x) { std::cout << "pixel at (" << x << ", " << y << "): " << image.get_pixel(x, y) << std::endl; } } return 0; } ``` 请确保在编译时链接vilib库,以便程序能够正确运行。 ### 回答2: C语言vilib是一个用于读取和处理图像的库。它提供了一组函数和结构体,用于打开、读取和关闭图像文件。 首先,我们需要包含vilib库的头文件,并确保正确链接vilib库。然后,我们可以使用vi_open_image()函数打开一个图像文件。该函数接受一个指向图像文件路径的字符串作为参数,并返回一个图像句柄。如果文件不存在或者无法打开,则返回NULL。 接下来,我们可以使用vi_read_image()函数读取图像数据。该函数接受一个指向目标buffer的指针、图像句柄以及所需的图像通道(比如RGB通道)。这个函数会将图像数据读取到目标buffer中。 如果我们需要访问图像的其他属性,如宽度、高度或位深度,我们可以使用vi_get_image_info()函数。该函数接受图像句柄以及一个指向图像信息结构体的指针作为参数,并将图像的属性值存储在该结构体中。 读取图像数据后,我们可以对其进行进一步的处理,如图像增强、滤波或分析。完成后,我们可以使用vi_close_image()函数关闭图像文件,并释放相关的资源。 总结起来,通过C语言的vilib库,我们可以方便地读取和处理图像。只需调用几个简单的函数,就能够读取图像文件,获取图像属性,并进行图像处理。 ### 回答3: vilib是一个用于读取和处理图像的C语言库。它提供了一组函数和数据结构,帮助开发者在C语言中读取和处理各种类型的图像。 使用vilib读取图像的步骤大致如下: 1. 导入vilib库。 2. 创建一个图像对象,并使用vilib函数指定图像的类型、大小和其他相关参数。 3. 使用vilib函数打开要读取的图像文件。 4. 使用vilib函数读取图像数据,并将其存储到先前创建的图像对象中。 5. 可选地,在读取图像后,可以使用vilib提供的图像处理函数对图像进行处理,例如调整亮度、对比度、旋转等操作。 6. 最后,使用vilib函数释放已分配的内存并关闭图像文件。 vilib提供了丰富的功能和选项,可以满足不同的图像处理需求。它支持多种图像格式,如JPEG、PNG、BMP等,并提供了高效的读取和处理性能。此外,vilib还提供了错误处理功能,可以帮助开发者更好地处理异常情况。 使用vilib读取图像的例子: ```c #include <stdio.h> #include "vilib.h" int main() { // 创建图像对象 VIImage image; // 打开图像文件 if (vi_open(&image, "test.jpg") != VI_SUCCESS) { printf("无法打开图像文件\n"); return -1; } // 读取图像数据 if (vi_read(&image) != VI_SUCCESS) { printf("无法读取图像数据\n"); return -1; } // 对图像进行处理 // ... // 释放内存并关闭图像文件 vi_close(&image); return 0; } ``` 总结而言,vilib是一个方便的C语言库,可以帮助开发者读取和处理图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言小火车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值