gcc学习记录
-Wall: 使输出中包含警告信息,提示一些可以避免的错误。如果没有错误,则不会输出信息。
-o:后面加上可执行文件的名字。如果不加-o选项,会默认生成a.out可执行文件。举例:gcc -Wall -o circle circle.c。因为加了-o circle,所以会生成circle可执行文件,而不生成a.out.
下面介绍四个过程:预处理,编译,汇编,链接。
1。预处理。
预处理主要是执行预处理指令和扩展宏。gcc一般不产生预处理后的中间输出。可以使用-E来输出预处理得到的结果。
-E:直接使用gcc -E circle.c,产生的结果会在屏幕上输出,输出内容很多。因为它包含了若干头文件的内容。使用gcc -E -o circle.i,产生的结果会重定向到circle.i。file.i表示经过了预处理后的c源文件。加上-C会在预处理的结果中包括注释。gcc -e -C -o circle.i circle.c.
-D name[=definition]: 这个不是很懂,大概是用来条件编译的,需要和#ifdex name一起用。
-U name:也不懂,和上一个有点关系。未定义符号name.
-I directory[:directory[...]]:当在源码中使用#include指令时,会从该目录和系统标准include目录寻找。通常的寻找顺序为:1)该源文件所在目录。2)通过 -I 选项指定的目录。3)环境变量C_INCLUDE_PATH and CPATH指定的目录。4)系统默认include目录。
-I- :这个选项用来分割-I directory,在-I-左边的目录,不适用于带有尖括号的#include指令,比如#inlcude<stdio.h>,就是说在找stdio.h这个文件时,不会在-I-左边的目录中找。-I-左边的目录只适用于带引号的文件,比如#include "myheader.h"。对-I-右边的目录,尖括号和双引号的文件都可以找。当使用 -I - 使,上面的四个寻找步骤中的第一步会忽略。
2。编译。
编译的工作就是把c程序翻译成汇编程序。一般,每个CPU 架构都有自己的汇编语言,所以汇编语言很多。一般情况,gcc把生成的汇编代码存储在临时文件中,但是当汇编开始运行后,会把它给删掉。可以使用-S来查看生成的汇编代码。
-S : -S 会生成以.s结束的 汇编语言文件。gcc -S circle.c, 会生成circle.s文件。
为了在汇编代码中生成包含C 语言变量名的注释,可以使用-fverbose-asm。举例:gcc -S -fverbose-asm circle.c。
3。汇编(或组装)
因为每个机器结构有自己的汇编语言。gcc使用一个汇编器将汇编语言程序转换成可执行二进制文件。结果是对象文件,包含从源文件生成的可执行机器代码和外部链接文件中所有对象对应的符号表。生成的对象文件也是临时的,会在链接时被删除。使用 -c选项来生成对象文件。
-c: 对象文件以.o结尾。gcc -c circle.c.
4。链接
将多个二进制文件链接成一个可执行文件。有三种链接不在gcc搜索范围内的库文件方式。
1) gcc -o circle circle.c /usr/local/lib/libmath.a。库文件链接的方式类似于对象文件。
2)使用-L选项。举例:gcc -o circle -L/usr/local/lib -lmath circle.c. 可以使用多个库目录,这可以用多个-L实现,也可以在目录间加,分隔实现。
3)使包含库的目录包含在环境变量LIBARY_PATH中。
综上,
-save-temps: 会保存所有中间文件。
-fsyntax-only: 仅检查语法是否正确,不做预处理、编译等操作。
3)
gcc学习记录的更多相关文章
- gcc学习记录2——多输入文件
首先有两个.c文件:circle.c和circulararea.c. 分别对两个源文件生成目标文件,circle.o和circulararea.o. gcc -c circle.c circularr ...
- 【golang学习记录】环境搭建
[golang学习记录]环境搭建 一. 概述 本文是[golang学习记录]系列文章的第一篇,安装Go语言及搭建Go语言开发环境,接下来将详细记录自己学习 go 语言的过程,一方面是为了巩固自己学到的 ...
- GCC学习(1)之MinGW使用
GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
随机推荐
- Dll注入:Ring3 层 APC注入
APC,即Asynchronous procedure call,异步程序调用APC注入的原理是:在一个进程中,当一个执行到SleepEx()或者WaitForSingleObjectEx()时,系统 ...
- win10蓝牙添加设备无法连接
解决方法: 打开运行窗口,输入services.msc. 找到蓝牙支持服务(或者Bluetooth Support Service),右键,属性,启动类型选择手动,启动服务. 还不行的话,此电脑右键, ...
- 弹出页面第一次加载可以生成table和方法的绑定,第二次点击进来不能生成table和方法的帮定
问题原因: 弹出页面的写法是每次点击都会在原有页面基础之上新添加一个将其覆盖,原有页面不关闭.我用的生成table和点击事件的绑定是id选择器.页面中只绑定第一次的页面,第二次的页面作用不上. 解决: ...
- 手把手教你用Docker部署一个MongoDB集群
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的.支持类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引 ...
- 2754: C++习题-快速排序
2754: C++习题-快速排序 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 921 Solved: 406[Submit][Status][Web ...
- MAC之tar解压与压缩gz打包命令
tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件! ...
- JS中的async/await的执行顺序详解
虽然大家知道async/await,但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 JavaScript 的 async/await(如果对async/await不熟悉 ...
- Struts2 In Action笔记_页面到动作的数据流入和流出
因为回答百度知道的一个问题,仔细查看了<Struts2 In Action>,深入细致的看了 “数据转移OGNL 和 构建视图-标签”,很多东西才恍然大悟. 一直觉得国外写的书很浮,不具有 ...
- 将指定的form表单所有输入项转为json数据
今天学习时,看到的将form表单中的输入数据转成json 的jquery代码,直接贴出来: $.fn.serializeJson=function(){ var serializeObj={}; va ...
- https及其背后的加密原理阅读总结
https是以安全为目标的http通道,简单讲是http的安全版.当我们往服务器发送比较隐私的数据(比如说你的银行卡,身份证)时,如果使用http进行通信.那么安全性将得不到保障. 首先数据在传输的过 ...