1.gcc安装

rpm -qa|grep gcc    ==>检查gcc是否安装
gcc -v ==>检查gcc版本
yum -y install gcc ==>安装gcc

 2.基本语法

gcc最基本的用法是:gcc [options] [filenames]

说明:如果已经为最新的目标文件,则不重新编译。使用示例test.c源码如下:

#include <stdio.h>
int main(void)
{
printf("Hello world/n");
return ;
}

(1)编译-c

gcc -c test.c             ==>编译不链接生成目标文件test.o
gcc -c test.c -o test.o ==>同上
gcc -c -o test.o test.c ==>同上

(2)链接-o

gcc  test.o -o test==>链接生成可执行文件test

(3)编译链接-o

gcc test.c -o test         ==>编译链接生成可执行文件test

(4)代码优化-O和引用头文件目录-I

gcc –c –O –I dirname test.c  ==>使用系统库则不用特意指出/usr/lib和/lib

(5)函数库引用-lname

-lname 链接时装载名为 libname.a 的函数库。例如,-lm 表示链接名为 libm.a 的数学函数库。

gcc test.c testsub.c -lm -o test

补充:自定义函数库(打包中间目标文件)ar命令

如果需要链接中间目标文件太多,链接时需要明显地指出所有中间目标文件名,十分不便。可以给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件静态库。

PS:我们可以使用中间目标文件(O文件或是OBJ文件)或静态库文件来链接我们的应用程序。

ar crv libtest.a *.o  ==>将该目录下的所有目标文件打包生成了libtest.a文件静态库

3.警告信息选项

使用示例main.c源文件如下:

#include <stdio.h>  

 void main(void)
{
long long int var = 1;
printf("It is not standard C code!/n");
}

(1)-pedantic

当gcc在编译不符合ANSI/ISO C 语言标准的源代码时,将产生相应的警告信息。

执行语句 gcc -pedantic main.c -o main

(2)-Wall

使 gcc 产生尽可能多的警告信息,建议在用 gcc 编译源代码时始终带上 -Wall 选项。

执行语句 gcc -Wall main.c -o main

(3)-Werror

gcc 将所有的警告当成错误进行处理,产生警告地方停止编译,这在使用自动编译工具(如 Make 等)时非常有用。

执行语句 gcc -Werror main.c -o main

(4)-w

关闭任何以W开头的警告信息,,建议不要使用此项。

执行语句 gcc -w main.c -o main

4.使用gdb进行调试

gdb是Linux下一款功能强大的调试工具。默认情况下,gcc 在编译时不会将调试符号插入到生成的二进制代码中,因为这样会增加可执行文件的大小。如果需要在编译时生成调试符号信息,可以使用 gcc 的 -g 或 -ggdb 选项。

(1)gdb功能

设置断点

监视程序变量的值

l程序的单步执行

显示、修改变量的值

显示、修改寄存器

查看程序的堆栈情况

远程调试

(2)gdb调试过程

a.程序经过预处理后,即进入编译阶段,进入编译阶段,首先声明编译:

b.格式:gdb test.c -o test -g

c.进入编译:gdb test

d.显示需要编译调试的源程序:l(list)//list filename

e.设置断点:b(break)行号

f.查看设置的断点:info b

g.运行调试程序:run

h.跳到下一个断点:c(continue)

i.单步运行的话使用:n(next)/s(step into)跳到函数体 //区别在与:next执行函数体,而step不执行函数体

j.调试过程中查看某个变量的变化:print i (每次都要手动设置)//display i(设置一次一直尾随,直到用“undisplay 变量标号” 停止)

k.退出当前的调试使用finish 跳出函数

l.清楚断点 clear 行号

m.Delete 断点信息序号// 删除所有断点或设置的要删除的断点

n.退出调试 q

o.b  num  if  i==20 设置断点的触发条件

p.condition num i==50 改变断点的触发条件

(3)常用命令汇总

 () gdb 可执行文件 : 表示对某个文件进行调试
() b 函数名/行数 : 在某个函数名或行数前设置断点
() run/r : 表示开始运行,如果是正在调试的程序的话,表示再次进行调试
() n/next : 表示执行下一行语句
() l/list : 列出源码默认10行(当前位置的上下共10行)
list 行号 : 列出行号上下共10行的源码
list 函数名 : 列出函数名上下共10行的源码
() s/step : 表示单步执行,进入函数
() p /x 变量名 : 按16进制输出变量的值
/d : 按10进制
/o : 按八进制
() set var 变量名=值 : 设置变量的值
() bt(backtrace) : 查看各级函数调用及参数,简写bt
()q/quit : 退出
()finish : 连续运行到当前函数返回为止,然后停下来等待命令
()continue/c : 跳转到下个断点,或者跳转到观察点
()ptype 变量名 : 可以查看变量的类型,简写为pt
()watch
作用:一般用来观察某个变量/内存地址的状态(也可以是表达式),
如可以监控该变量/内存值是否被程序读/写情况。
有三种方法:
.watch expr(指定变量/内存地址/表达式)
一旦expr的值有变化时,将停住程序。
.rwatch expr
当expr被读时,停住程序。
.awatch expr
当expr被读或被写时,停住程序。
watch使用步骤:
. 使用break在要观察的变量所在处设置断点;
. 使用run执行,直到断点;
. 使用watch设置观察点;
. 使用continue观察设置的观察点是否有变化。
()start : 开始执行程序,停在main函数第一行语句前面等待命令
()info watchpoints : 列出所有观察点
info breakpoints : 查看当前设置的所有断点
()d/delete [breakpoinsts num] [rang...]
d/delete : 删除所有断点
d/delete num : 删除breakpoints为num的断点
d/delete num1-num2 : 删除breakpoints为num1-num2的断点
()enable num : 启用num号断点
()disable num : 关闭num号断点
()u/until : 结束当前循环

5.IDE工具

可以使用IDE工具codeblocks

参考文档:

gcc的使用简介与命令行参数说明

GCC编译器编译链接

gcc编译与gdb调试简要步骤

Linux下编辑、编译、调试命令总结——gcc和gdb描述

【C编程基础】C编译链接命令gccc的更多相关文章

  1. 如何查看VisualStudio的编译, 链接命令

    VisualStudio默认是不显示编译命令的,如何查看呢. 对于链接器: 项目属性 -> 配置属性 -> 链接器 -> 常规 -> 显示进度 -> 设为 "/ ...

  2. shell编程基础(七): 处理文件命令sed与awk

    一.sed(以行为单位处理文件) sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑 ...

  3. Windows 编程,程序编译使用的命令行工具。

    Windows 编程,程序编译使用的命令行工具. 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译为obj文件. 2.rc.exe文件是资源编译器.工程项目中的.rc文件 ...

  4. 【C编程基础】make命令和makefile文件

    1.关于程序的编译和链接 一般来说,无论是C.C++首先要把源文件编译成中间目标文件即 Object File(windows为.obj文件,unix为.o文件),这个动作叫做编译(compile). ...

  5. python 小白(无编程基础,无计算机基础)的开发之路 day1

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  6. Shell编程基础篇

    1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚 ...

  7. 操作系统内核Hack:(二)底层编程基础

    操作系统内核Hack:(二)底层编程基础 在<操作系统内核Hack:(一)实验环境搭建>中,我们看到了一个迷你操作系统引导程序.尽管只有不到二十行,然而要完全看懂还是需要不少底层软硬件知识 ...

  8. linux下c编程 基础

    1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理 ...

  9. Shell编程基础篇-上

    1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚 ...

随机推荐

  1. 快速搭建一个Quartz定时任务【转载,好文 ,值得收藏,亲身试用 效果不错】

    Quartz.NET 入门 概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔 ...

  2. 模块热替换 HMR

    devserver:{hot:true},既及时更新代码,样式(需配合loader)变化,自动重编译,只适用于开发环境. 入口文件中,添加监视: + if (module.hot) {+ module ...

  3. Linux-cut命令(22)

    cut剪切命令cut命令通常用来对某个文本文件进行解析,擅长处理以一个字符间隔的文本内容 -b :以字节(bytes)为单位进行分割.这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志. -c ...

  4. 通过DFS求解有向图(邻接表存储)中所有简单回路

    前言 查阅了网上许多关于通过DFS算法对有向图中所有简单回路的查找,发现有很多关于使用DFS求解有向回路中所有简单回路的帖子,(在按照节点编号情况下)但大多数仅仅寻找了编号递增的回路.又或者未对结果去 ...

  5. 《从Paxos到ZooKeeper 分布式一致性原理与实践》读书笔记

    一.分布式架构 1.分布式特点 分布性 对等性.分布式系统中的所有计算机节点都是对等的 并发性.多个节点并发的操作一些共享的资源 缺乏全局时钟.节点之间通过消息传递进行通信和协调,因为缺乏全局时钟,很 ...

  6. awesome python 中文版 相见恨晚!

    awesome python 中文版 相见恨晚!   https://www.zhihu.com/question/24590883 这篇知乎厉害了!一定要学习! 作者:知乎用户链接:https:// ...

  7. Go开发之路 -- 时间和日期类型

    time包 time.Time类型, 用来表示时间 获取当前时间, now := time.Now() time.Duration() 用来表示纳秒 时间类型的格式化 now := time.Now( ...

  8. JDK和Tomcat安装

    JDK安装: 1,选择安装位置,其余默认安装,安装两次,一个是JDK,一个是JRE,安装在两个文件夹中. 2,配置环境变量: 1,新建一个变量,变量名:JAVA_HOME,变量值:C:\Program ...

  9. vuejs2.0与1.x版本中怎样使用js实时访问input的值的变化

    vuejs 2.0中js实时监听input 在2.0的版本中,vuejs把v-el 和 v-ref 合并为一个 ref 属性了,可以在组件实例中通过 $refs 来调用.这意味着 v-el:my-el ...

  10. 2018-08-14 中文代码之Spring Boot实现简单REST服务

    最终目标详见: 参考MSDN,试搞.NET类库标识符的翻译版 · Issue #54 · program-in-chinese/overview 此文仅为技术探索+原型搭建的第一小步. 源码库: 演示 ...