GCC、头文件查找顺序总结

2023-11-19

GCC笔记

The History of GCC


--------------------------------------------------------------------------------


1984年,Richard Stallman发起了自由软件运动,GNU (Gnu's Not Unix)项目应运而生,3年后,最初版

的GCC横空出世,成为第一款可移植、可优化、支持ANSI C的开源C编译器。
GCC最初的全名是GNU C Compiler,之后,随着GCC支持的语言越来越多,它的名称变成了GNU Compiler

Collection。
这里介绍的gcc是GCC的前端,C编译器.


警告信息


--------------------------------------------------------------------------------

    -Wall : 显示所有常用的编译警告信息。
    -W    : 显示更多的常用编译警告,如:变量未使用、一些逻辑错误。
    -Wconversion : 警告隐式类型转换。
    -Wshadow : 警告影子变量(在代码块中再次声明已声明的变量)
    -Wcast-qual :警告指针修改了变量的修饰符。如:指针修改const变量。
    -Wwrite-strings : 警告修改const字符串。
    -Wtraditional : 警告ANSI编译器与传统C编译器有不同的解释。
    -Werror : 即使只有警告信息,也不编译。(gcc默认:若只有警告信息,则进行编译,若有错误信

息,则不编译)


C语言标准


--------------------------------------------------------------------------------


你可以在gcc的命令行中通过指定选项来选择相应的C语言标准: 从传统c到最新的GNU扩展C. 默认情况下,

gcc使用最新的GNU C扩展.

    -ansi : 关闭GNU扩展中与ANSI C相抵触的部分。
    -pedantic          : 关闭所有的GNU扩展。
    -std=c89           : 遵循C89标准
    -std=c99           : 遵循C99标准
    -std=traditional : 使用原始C
注意:后4个选项可以与-ansi结合使用,也可以单独使用。

可在gcc中使用大量GNU C扩展.

生成特定格式的文件


--------------------------------------------------------------------------------

以hello.c为例子,可以设置选项生成hello.i, hello.s, hello.o以及最终的hello文件:

    hello.c : 最初的源代码文件;
    hello.i : 经过编译预处理的源代码;
    hello.s : 汇编处理后的汇编代码;
    hello.o : 编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的内

存位置尚未定义。
    hello / a.out : 最终的可执行文件
    (还有.a(静态库文件), .so(动态库文件), .s(汇编源文件)留待以后讨论)


如果你不通过-o指定生成可执行文件名,那么会默认生成a.out. 不指定生成文件名肯能覆盖你上次生成

的a.out.


e.g.
$ gcc hello.c
在不给gcc传递任何参数的情况下, gcc执行默认的操作: 将源文件编译为目标文件--> 将目标文件连接为

可执行文件(名为a.out) --> 删除目标文件.


-c生成.o文件时,默认生成与源代码的主干同名的.o文件。比如对应hello.c生成hello.o. 但也可在生成

目标文件时指定目标文件名(注意同时要给出.o后缀): $ gcc -c -o demo.o demo.c


    $ gcc -Wall -c hello.c              : 生成hello.o
    $ gcc -Wall -c -save-temps hello.c : 生成hello.i, hello.s, hello.o
    注意-Wall 选项的使用场合:仅在涉及到编译(即会生成.o文件时,用-Wall)  


多文件编译、连接

--------------------------------------------------------------------------------

如果原文件分布于多个文件中:file1.c, file2,c
    $ gcc -Wall file1.c file2.c -o name

若对其中一个文件作了修改,则可只重新编译该文件,再连接所有文件:
    $ gcc -Wall -c file2.c
    $ gcc file1.c file2.o -c name

注意:若编译器在命令行中从左向右顺序读取.o文件,则它们的出现顺序有限制:含有某函数定义的文件

必须出现在含有调用该函数的文件之后。好在GCC无此限制。


编译预处理


--------------------------------------------------------------------------------
以上述的hello.c为例, 要对它进行编译预备处理, 有两种方法: 在gcc中指定-E选项, 或直接调用

cpp.gcc的编译预处理命令程序为cpp,比较新版本的gcc已经将cpp集成了,但仍提供了cpp命令. 可以直

接调用cpp命令, 也可以在gcc中指定-E选项指定它只进行编译预处理.

$ gcc -E hello.c                            == $ cpp hello.c
上述命令马上将预处理结果显示出来. 不利于观看. 可采用-c将预处理结果保存:
$ gcc -E -c hello.i hello.c              == $ cpp -o hello.i hello.c
注意, -c指定名称要给出".i"后缀.

另外, gcc针对编译预处理提供了一些选项:
(1) 除了直接在源代码中用 #define NAME来定义宏外,gcc可在命令行中定义宏:-DNAME(其中NAME为宏

名), 也可对宏赋值: -DNAME=value 注意等号两边不能有空格! 由于宏扩展只是一个替换过程,也可以

将value换成表达式,但要在两边加上双括号: -DNAME="statement"
e.g. $ gcc -Wall -DVALUE="2+2" tmp.c -o tmp
如果不显示地赋值,如上例子,只给出:-DVALUE,gcc将使用默认值:1.

(2) 除了用户定义的宏外, 有一些宏是编译器自动定义的,它们以__开头,运行: $ cpp -dM /dev/null,

可以看到这些宏. 注意, 其中含有不以__开头的非ANSI宏,它们可以通过-ansi选项被禁止。

查看宏扩展

1, 运行 $ gcc -E test.c ,gcc对test.c进行编译预处理,并立马显示结果. (不执行编译) 2, 运行 $

gcc -c -save-temps test.c ,不光产生test.o,还产生test.i, test.s,前者是编译预处理结果, 后者

是汇编结果.
    
利用Emacs查看编译预处理结果

针对含有编译预处理命令的代码,可以利用emacs方便地查看预处理结果,而不需执行编译,更为方便的

是,可以只选取一段代码,而非整个文件:
1,选择想要查看的代码
2,C-c C-e (M-x c-macro-expand)
这样,就自动在一个名为"Macroexpansion"的buffer中显示pre-processed结果.

生成汇编代码

--------------------------------------------------------------------------------
使用"-S"选项指定gcc生成以".s"为后缀的汇编代码:
$ gcc -S hello.c
$ gcc -S -o hello.s hello.c

生成汇编语言的格式取决于目标平台. 另外, 如果是多个.c文件, 那么针对每一个.c文件生成一个.s文件

.

包含头文件


--------------------------------------------------------------------------------
在程序中包含与连接库对应的头文件是很重要的方面,要使用库,就一定要能正确地引用头文件。一般在

代码中通过#include引入头文件, 如果头文件位于系统默认的包含路径(/usr/includes), 则只需在

#include中给出头文件的名字, 不需指定完整路径. 但若要包含的头文件位于系统默认包含路径之外,

则有其它的工作要做: 可以(在源文件中)同时指定头文件的全路径. 但考虑到可移植性,最好通过-I在调

用gcc的编译命令中指定。


下面看这个求立方的小程序(阴影语句表示刚开始不存在):

#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
double x = pow (2.0, 3.0);
printf("The cube of 2.0 is %f\n", x);
return 0;
}


使用gcc-2.95来编译它(-lm选项在后面的连接选项中有介绍, 这里只讨论头文件的包含问题):
$ gcc-2.95 -Wall pow.c -lm -o pow_2.95
pow.c: In function `main':
pow.c:5: warning: implicit declaration of function `pow'

程序编译成功,但gcc给出警告: pow函数隐式声明。
$ ./pow_2.95
The cube of 2.0 is 1.000000

明显执行结果是错误的,在源程序中引入头文件(#include <math.h>),消除了错误。

不要忽略Warning信息!它可能预示着,程序虽然编译成功,但运行结果可能有错。故,起码加上"-Wall"

编译选项!并尽量修正Warning警告。


搜索路径

首先要理解 #include<file.h>和#include"file.h"的区别:
#include<file.h>只在默认的系统包含路径搜索头文件
#include"file.h"首先在当前目录搜索头文件, 若头文件不位于当前目录, 则到系统默认的包含路径搜索

头文件.


UNIX类系统默认的系统路径为:

头文件,包含路径: /usr/local/include/ or /usr/include/
库文件,连接路径: /usr/local/lib/          or /usr/lib/
   

对于标准c库(glibc或其它c库)的头文件, 我们可以直接在源文件中使用#include <file.h>来引入头文件

.


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC、头文件查找顺序总结 的相关文章

  • Linux下ps命令实现

    include
  • debian系统配置ip地址

    在Debian中网卡的设置可以通过 etc network interfaces文件来进行 具体可分为三种不同的配置方式 DHCP自动获取 静态分配IP地址和PPPoE宽带拨号 具体设置如下 在进行配置之前 首先进入 etc network
  • linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案

    1 问题描述 最近搭建的一个linux最小系统在运行到241秒时在控制台自动打印如下图信息 并且以后每隔120秒打印一次 仔细阅读打印信息发现关键信息是 hung task timeout secs 第一次遇到这样的问题 首先百度 通过翻看
  • C语言libcurl库的使用

    C语言libcurl库的安装与使用 curl库的作用是访问http和HTTPS网站 HTTPS加密的网站 在linux和树莓派都可以 把curl 7 71 1 tar bz文件复制到linux的工作目录 home lth mkdir htt
  • Linux TCP客户端、服务器编程模型及实例

    Linux TCP客户端 服务器编程模型及实例 服务器模型 1 绑定IPv4的地址 INADDR ANY 和端口号 8888 int listenfd sockfd opt 1 struct sockaddr in server clien
  • EPICS asynPortDriver中数组用法示例

    本驱动程序是继承自asynPortDriver 分别重写了用于读取32位整型数组和32位浮点型数组的 readInt32Array和readFloat32Array 1 源代码如下 arraydriver h include epicsEv
  • linux读取触摸屏事件数据

    对于有触摸设备的电脑或者手机 通过cat proc bus input devices应该就能够看到触摸设备的相关信息 比如 cat proc bus input devices I Bus 0013 Vendor 0x0012 Produ
  • C语言实现成语接龙完整版

    C语言实现成语接龙报告完整版 代码在最后面 实验报告书 实验名称 成语接龙人机对战游戏 摘要 成语接龙是中华民族传统的文字游戏 它有着悠久的历史 也有广泛的社会基础 是老少皆宜的民间文化娱乐活动 同时成语又是体现我国文字 文化 文明的一个缩
  • LRC歌词解析,实现Linux设备播放音乐显示歌词 LRC解析

    开始正文 1 关于LRC lrc是英文lyric 歌词 的缩写 被用做歌词文件的扩展名 以lrc为扩展名的歌词文件可以在各类数码播放器中同步显示 LRC 歌词是一种包含着 形式的 标签 tag 的 基于纯文本的歌词专用格式 最早由郭祥祥先生
  • linux下添加cmath库

    在Terminal下输入g sqrt c lm即可
  • ubuntu下学习c++(输出定义变量)

    2022 6 11 学习cout cin的使用方法以及变量的定义 include
  • C语言void指针及使用注意事项详解

    void 指针是一种特殊的指针 表示为 无类型指针 在 ANSI C 中使用它来代替 char 作为通用指针的类型 由于 void 指针没有特定的类型 因此它可以指向任何类型的数据 也就是说 任何类型的指针都可以直接赋值给 void 指针
  • VMware Workstation Pro 17 虚拟机安装Ubuntu18.4.06

    VMware Workstation Pro 17 虚拟机安装Ubuntu18 4 06 1 下载Ubuntu镜像文件 2 安装VMware Workstation Pro 17 3 使用VMware创建虚拟机 4 安装Ubuntu18 4
  • 设置vim 永久显示行号

    在linux环境下 vim是常用的代码查看和编辑工具 在程序编译出错时 一般会提示出错的行号 但是用vim打开的代码确不显示行号 错误语句的定位非常不便 那么怎样才能让vim显示代码的行号呢 1 临时显示行号 如果只是临时显示vim的行号
  • xdg-open 未找到命令

    安装 apt get install xdg utils root kylinos xdg open bash xdg open 未找到命令 root kylinos apt get install xdg utils 正在读取软件包列表
  • gdb调试心得体会

    gdb调试心得体会 首先进入gdb 调试二进制程序 gdb msgsvr dev 然后 运行 run 然后coredump了 输入bt查看调用栈 bt 然后查看函数栈 f 进入到指定的函数 然后查看具体行数 l number 然后break
  • GCC、头文件查找顺序总结

    GCC笔记 The History of GCC 1984年 Richard Stallman发起了自由软件运动 GNU Gnu s Not Unix 项目应运而生 3年后 最初版 的GCC横空出世 成为第一款可移植 可优化 支持ANSI
  • sbrk/brk函数用法

    头文件unistd h sbrk brk函数重新指定数据段的结束位置 sbrk 0 获得当前数据段结束地址 sbrk 增量 增量可正 可负 可为0 都返回原来数据段的结束地址 失败返回 1 brk 地址 返回0或 1 通过重新指定数据段新的
  • LinuxC中进程通信

    LinuxC中进程通信 信号 Signals Linux 提供了信号机制 允许一个进程向另一个进程发送信号以通知特定事件的发生 这是一种轻量级的通信机制 通常用于处理异步事件 您可以使用 kill 命令或 kill 函数来发送信号 然后使用
  • unistd.h中定义的setsid()与fork()

    setsid 是一个UNIX系统调用 用于创建一个新的会话 session 并将当前进程设置为该会话的领头进程 session leader 通常情况下 setsid 函数用于创建守护进程 daemon 以确保它与任何终端分离 从而可以在后

随机推荐

  • 孤立森林的简要记录

    20200920 0 引言 在之前的时候 进行一些任务分类的时候 使用过孤立森林来实现一些代码 但是也没有具体来深究原理 只知道这个跟随机森林有些像 都是决策树的一种集成方式 最近正好看到了这部分内容 就正好记录一下 本部分内容主要是有文章
  • gorm报错reflect: reflect.Value.SetInt using unaddressable value

    reflect reflect Value SetInt using unaddressable value 这种报错是应该传地址的时候传了值导致的 经过检查 gorm包下的方法如Create的参数应该是地址 比如 err global D
  • 代码复现不稳定应该怎么调整

    tensorflow转为pytorch代码 复现结果浮动较大 尝试方法 在测试和验证部分加入 model eval 去掉训练部分的shuffle 保证每次送入的数据一样 设定各个部分的随机种子 random seed 42 np rando
  • 8种常见的 代码 编译 软件 !!

    VS Code Source Insight Vim UltraEdit eclipse Understand Atom Sublime Text 接下来详细为大家讲解一下它们各自的用途 目录 1 VS Code 2 Source Insi
  • 密码学哈希函数_哈希函数在密码学中的应用

    密码学哈希函数 A Hash Function is a mathematical function that converts a numerical value into another compressed numeric value
  • FullGC问题分析

    一 常见的FullGC场景分析 频繁的大对象 大对象直接被分配到老年代 系统高负载运行 请求量很大 jvm来不及将对象转移到老年代 直接到老年代分配对象 系统内存泄漏 导致对象长时间在老年代 得不到释放 二 产生FullGC的原因 Syst
  • Tracy 小笔记 Vue - 数据展示,基本指令,绑定属性 v-bind,v-for,条件渲染,强制渲染

    数据展示 插值操作 data 里的数据都是怎么显示在页面上的 Mustache 语法 胡须 也就是双大括号 变量 简单表达式 基本指令 v once 指令的使用 h2 message h2 如果需求是只显示最初的值 以后值不变 就要加这个指
  • MFC读写excel文件

    MyExcel cpp include stdafx h include MyExcel h CMyExcel CMyExcel StartApp CMyExcel CMyExcel books Close sheet ReleaseDis
  • Python爬虫进行接口测试

    一 爬虫概述 1 爬虫简介 UI页面的测试 除了定位元素和模拟操作外 更多的是需要收集一些数据并进行后续的逻辑处理 这时就需要使用爬虫技术来实现数据有爬取 爬虫技术也可以用于测试 例如通过爬虫对测试页面进行采集和分析 对功能点进行冒烟测试
  • QFile读取文件乱码问题

    2020 3 11 使用Qt的QFile打开文件时 中文输出乱码 知道是编码的问题 由于第一次接触Qt 所有不太清楚如何解决 查询一番 认识了一个类QTextCodec 感觉这个比较好 记在这里 方便日后复习 解决方法 QTextCodec
  • 通过反射来获取某个类中的构造方法,普通方法,属性

    反射 反射机制是在运行状态中 对于任意一个类 都能够知道这个类的所有属性和方法 对于任意一个对象 都能够用它的任意一个方法和属性 这种动态获取信息以及动态调用对象的方法的功能就是java中的反射机制 要想解剖一个类 必须先要获取到该类的字节
  • 关于close-on-exec标志

    每个文件描述符都有一个close on exec标志 默认情况下 这个标志最后一位被设置为 0 这个标志符的具体作用在于当开辟其他进程调用exec 族函数时 在调用exec函数之前为exec族函数释放对应的文件描述符 我们来看一下具体的实例
  • mysql中ddl是什么_MySQL中DDL是什么意思

    MySQL中DDL是什么意思 发布时间 2020 11 20 14 34 51 来源 亿速云 阅读 80 作者 小新 这篇文章将为大家详细讲解有关MySQL中DDL是什么意思 小编觉得挺实用的 因此分享给大家做个参考 希望大家阅读完这篇文章
  • 关于在宝塔面板的基础上搭建Wordpress个人博客的教程

    此教程是在你已经有个人服务器并且已经做好宝塔面板的基础上进行的 如果没有做好也可以提前进行学习 如果在搭建过程中出现问题也希望大家积极指出 那么就开始我们的搭建吧 首先登录我们网站后台 登录宝塔面板 关于这个是你之前已经设置好的密码 直接登
  • C++Primer第五版 习题答案 第十八章 用于大型程序的工具(Tools for Large Programs)

    练习18 1 在下列 throw 语句中异常对象的类型是什么 a range error r error throw r b exception p r throw p a range error b exception throw p 此
  • docker安装mongo

    查看是否已经安装了mongo镜像文件 如果没用安装就执行命令安装 docker pull mongo latest 安装后执行命令 运行MongoDB容器 docker run itd name mongo p 27017 27017 mo
  • 两种方法在Django框架中支持后台返回包含中文的JSON/数组格式

    去年因缘际会 和Django接触了有半年时间 Django有开发快速 语言简洁的特点 对于web前端开发人员来说 其官方的模板系统也是尽量做到逻辑与显示分离的典型例子 在开发的期间 也积累了一些这方面的经验 一个印象比较深的例子就是如何支持
  • npm install 报错 npm ERR! Unexpected token ‘.‘

    报错如下图 报错原因 弄得版本太高 解决办法 卸载node重新安装 或者使用nvm切换版本
  • 计算机软件留学,PERSONAL STATEMENT(计算机软件专业)

    Knowing where one is heading during navigation brings assured happiness As a student majoring in Computer Software I beg
  • GCC、头文件查找顺序总结

    GCC笔记 The History of GCC 1984年 Richard Stallman发起了自由软件运动 GNU Gnu s Not Unix 项目应运而生 3年后 最初版 的GCC横空出世 成为第一款可移植 可优化 支持ANSI