C和C++中include 搜索路径的一般形式

对于include 搜索的路径:

  C中可以通过 #include <stdio.h> 和 #include "stidio.h" ,区别是:

  在UNIX系统中,尖括号告诉编译器在一个或者多个标准系统目录中找到文件 /usr/include /usr/local/include;即系统头文件所在的目录。

  看看这些文件夹下是否有该头文件;如果没有,也不会检索当前文件所在路径,并将报错。

  使用双引号,编译器先到当前目录查找头文件或文件名中指定的其他目录,如果没找到在到标准系统目录查找。

  即,首先搜索本地目录,但是具体哪个目录依赖于编译器。有些编译器搜索源代码所在目录,有些则搜索当前目录,还有些搜索工程文件所在目录。当出现此类问题时,我们最好注意自己所用的编译器是如何操作的。在下面说明了gcc是如何操作的。

  同时,include也可以采用相对路径。比如,a.c需要/usr/local/include/Tleap/leap.h,而/usr/local/include是系统的默认搜索路径,所以在a.c中可以用相对路径包含,

  #include<Tleap/leap.h>。

  对于系统头文件,很多IDE具有标准搜索路径,IDE提供菜单选项用于指定使用尖括号时搜索的路径。

  查看GCC的搜索目录:(gcc --help)

  查看编译c++文件使用的头文件目录的命令为:`gcc -print-prog-name=cc1plus` -v

  查看编译c文件的头文件搜索目录的命令为 `gcc -print-prog-name=cc1` -v

gcc寻找头文件的路径:

  1.在gcc编译源文件的时候,通过参数 -I 指定头文件的搜索路径,如果指定路径有多个路径时,则按照指定路径的顺序搜索头文件。

命令形式如:“gcc -I /path/where/theheadfile/in sourcefile.c“,这里源文件的路径可以是绝对路径,也可以是相对路径。eg:设当前路径为/root/test,如果include_test.c要使用头文件“include/include_test.h“,有两种方法:
  1) include_test.c中#include “include/include_test.h”或者#include "/root/test/include/include_test.h",然后gcc include_test.c即可

  2) include_test.c中#include /include_test.h ,然后gcc –I include include_test.c也可

 2. 通过查找gcc的环境变量C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、OBJC_INCLUDE_PATH来搜索头文件位置。

 3. 再找标准系统目录搜索,分别是

/usr/include

/usr/local/include

/usr/lib/gcc-lib/i386-linux/2.95.2/include

最后一行是gcc程序的库文件地址,各个用户的系统上可能不一样。

gcc在默认情况下,都会指定到/usr/include文件夹寻找头文件。

gcc还有一个参数:-nostdinc,它使编译器不再系统缺省的头文件目录里面找头文件,一般和 -I 联合使用,明确限定头文件的位置。在编译驱动模块 时,由于一些需求必须强制GCC不搜索系统默认路径,也就是不搜索/usr/include,这时就要用参数-nostdinc,还要自己用 -I 参数来指定内核头文件路径,这个时候在Makefile中指定即可。
  4. 当#include使用相对路径的时候,gcc最终会根据上面这些路径,来最终构建出头文件的位置。如#include 就是包含文件/usr/include/sys/types.h

注:-I 指定的目录,在使用尖括号引用时,是先于标准头文件目录被搜索的。例如使用了 -I./,且当前目录下有一个 stdio.h,那么在 #include <stdio.h>时,所引用的是当前目录下的stdio.h,而不是系统自带的标准头文件。

C和C++中include 搜索路径的一般形式以及gcc搜索头文件的路径的更多相关文章

  1. gcc指定头文件路径及动态链接库路径

    gcc指定头文件路径及动态链接库路径   本文详细介绍了linux 下gcc头文件指定方法,以及搜索路径顺序的问题.另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论了搜索路径的顺序问题.本 ...

  2. 用 #include <filename.h> 格式来引用标准库的头文件

    用 #include <filename.h> 格式来引用标准库的头文件(编译器将从 标准库目录开始搜索). #include <iostream> /* run this p ...

  3. vs 中明明包含了头文件所在路径,但是却找不到头文件

    vs基本不会出错,那么出错的只能是自己了. 哎,又被自己给蠢死了. 你可能在上面两个地方添加好了include 目录,但是却依然编译失败,失败的提示是找不到头文件所在路径,这是为什么呢. 很简单,因为 ...

  4. gcc和arm-linux-gcc 头文件寻找路径【转】

    原文地址:http://blog.chinaunix.net/uid-29145190-id-3867605.html 在LINUX程序设计当中,经常会遇到头文件包含的问题,那么这些头文件到底在哪个路 ...

  5. Linux下包含头文件的路径问题与动态库链接路径问题

    C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路径. [1 ...

  6. linux编程头文件所在路径的问题

    一.问题引入 1.头文件与库 当我们在PC主机linux环境下(如ubuntu),编写linux应用程序,然后利用gcc来编译.在源代码的开始位置会写入头文件,那是因为我们使用了系统提供的库函数,例如 ...

  7. linux 编译指定库、头文件的路径问题(转)

    1. 为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得 ...

  8. [转]Linux学习笔记——例说makefile 头文件查找路径

    0.前言     从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助 ...

  9. Cmake 脚本对项目输出路径和输出头文件的路径定义

    对Lib项目的统一输出路径以下时解决方案: set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)set(CMAKE_LIBRARY_O ...

随机推荐

  1. Java集合类总结 (一)

    集合类中的基本接口 集合类中最基础的接口是Collection: public interface Collection<E> { boolean add(E element); Iter ...

  2. wifi 定位

    前一天跟某电信公司一位朋友聊天: 问:电信用户现在能占手机用户多少比例? 答:(??) 问:把cdma给了电信,其实就是给个根鸡肋. 答:呃,看怎么说.对于电信来说,毕竟拿到了移动牌照. 问:工作行不 ...

  3. Oracle动态执行表不可访问

    在scott 用户下,执行查询语句是出现"Oracle动态执行表不可访问" 经查,是因为用户权限不够所致,修改scott用户权限语句如下: grant select on V_$s ...

  4. c#后台弹出框

    ClientScript.RegisterStartupScript(this.GetType(), "message", "<script>alert('提 ...

  5. Day 3 Python 基础数据类型二

    1. INT 型 #1. 数字int #bit_length() 当十进制用二进制表示时,最少使用的位数. v =11 data = v.bit_length() print(data) 2. 布尔值 ...

  6. 文件上传下载(C#,web,asp.net)

    目的:在浏览器页面启动上传下载CS软件,实现文件的批量下载与上传. 技术路线: 开发上传下载客户端CS程序与注册程序,压缩放到服务器端指定位置: 开发服务器端程序用以接收上传请求,压缩放到服务器端: ...

  7. centos7用docker安装kafka

    参考之前的文章安装zookeeper集群  https://www.cnblogs.com/xiaohanlin/p/10124674.html 如果是测试环境也可以简单安装单节点的zookeeper ...

  8. 公司拷贝回家的工程用sts导入clean package报错java.lang.NoClassDefFoundError

    从公司拷贝工程回家加班,用相同版本的sts和jdk但是run as    maven build   clean package 总是报错java.lang.NoClassDefFoundError: ...

  9. Udp 网络字节序

    1.网络上的数据是一个字节一个字节的串行传递的. 2.字节序,规定,在内存里存储时,低字节在前称为小端,高字节在前称为大端,(现在主流系统都是小端的) 3.网络字节序,如果先传高字节,则是大端传输:如 ...

  10. Qt 学习之路 2(38):存储容器

    Qt 学习之路 2(38):存储容器 豆子 2013年1月14日 Qt 学习之路 2 38条评论 存储容器(containers)有时候也被称为集合(collections),是能够在内存中存储其它特 ...