1.建一个目录
2.写代码,建一个hello.c文件
代码:
view plaincopy to clipboard
#include"stdio.h"
main()
{
printf("HelloLinux.\n")
}
#include"stdio.h"
main()
{
printf("Hello Linux.\n")
}
记得最后一定要换行
3.编译
gcc-ohellohello.c
使用gcc编译器就会为我们生成一个hello的可执行文件
4.输出
执行./hello就可以看到程序的输出结果了.
是不是很简单?
命令行中gcc表示我们是用gcc来编译我们的源程序,-o选项表示我们要求编译器给我们输出的可执行文件名为hello而hello.c是我们的源程序文件.gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了.-o选项我们已经知道了,表示我们要求输出的可执行文件名.-c选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件.-g选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息.知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说明.
下面我们来演示怎样用GDB来调试一个求0+1+2+3+…+99的程序:
/* Filename:hello.c */
#include "stdio.h"main(){int i, sum;sum = 0;for (i = 0; i
执行如下命令编译hello.c(加-g选项产生debug信息):#gcc –g –ohello sum.c在命令行上键入gdb hello并按回车键就可以开始调试sum了,再运行run命令执行sum
#gdb hello
![](http://file.elecfans.com/web1/M00/57/D0/pIYBAFtMX-iAMvqDAADOIzkd0ow969.png)
list命令用于列出源代码,对上述程序两次运行list,将出现如上画面(源代码被标行号)。
根据列出的源程序,如果我们将断点设置在第5行,只需在gdb 命令行提示符下键入如下命令设置断点:(gdb) break 5
设置断点的另一种语法是 break ,它在进入指定函数(function)时停住。相反的,clear用于清除所有的已定义的断点,clear 清除设置在函数上的断点, clear 则清除设置在指定行上的断点。watch命令:watch命令用于观查变量或表达式的值,我们观查sum变量只需要运行watch sum
watch 为表达式(变量)expr设置一个观察点,一量表达式值有变化时,程序会停止执行。要观查当前设置的watch,可以使用info watchpoints命令。next、step命令:next、step用于单步执行,在执行的过程中,被watch变量的变化情况将实时呈现(分别显示Old value和New value)
next、step命令的区别在于step遇到函数调用,会跳转到到该函数定义的开始行去执行,而next则不进入到函数内部,它把函数调用语句当作一条普通语句执行。
5.Make
make是所有想在Linux系统上编程的用户必须掌握的工具,对于任何稍具规模的程序,我们都会使用到make,几乎可以说不使用make的程序不具备任何实用价值。
在此,我们有必要解释编译和连接的区别。编译器使用源码文件来产生某种形式的目标文件(object files),在编译过程中,外部的符号参考并没有被解释或替换(即外部全局变量和函数并没有被找到)。因此,在编译阶段所报的错误一般都是语法错误。而连接器则用于连接目标文件和程序包,生成一个可执行程序。在连接阶段,一个目标文件中对别的文件中的符号的参考被解释,如果有符号不能找到,会报告连接错误。
编译和连接的一般步骤是:第一阶段把源文件一个一个的编译成目标文件,第二阶段把所有的目标文件加上需要的程序包连接成一个可执行文件。这样的过程很痛苦,我们需要使用大量的gcc命令。
而make则使我们从大量源文件的编译和连接工作中解放出来,综合为一步完成。GNU Make的主要工作是读进一个文本文件,称为makefile。这个文件记录了哪些文件(目的文件,目的文件不一定是最后的可执行程序,它可以是任何一种文件)由哪些文件(依靠文件)产生,用什么命令来产生。Make依靠此makefile中的信息检查磁盘上的文件,如果目的文件的创建或修改时间比它的一个依靠文件旧的话,make就执行相应的命令,以便更新目的文件。
假设我们写下如下的三个文件,add.h用于声明add函数,add.c提供两个整数相加的函数体,而main.c中调用add函数:
/* filename:add.h */extern int add(int i, int j);/* filename:add.c */int add(int i, int j){return i + j;}/* filename:main.c */#include "add.h"main(){int a, b;a = 2;b = 3;printf("the sum of a+b is %d", add(a + b));}
怎样为上述三个文件产生makefile呢?如下:
test : main.o add.ogcc main.o add.o -o testmain.o : main.c add.hgcc -c main.c -o main.oadd.o : add.c add.hgcc -c add.c -o add.o
上述makefile利用add.c和add.h文件执行gcc -c add.c -o add.o命令产生add.o目标代码,利用main.c和add.h文件执行gcc -c main.c -o main.o命令产生main.o目标代码,最后利用main.o和add.o文件(两个模块的目标代码)执行gcc main.o add.o -o test命令产生可执行文件test。我们可在makefile中加入变量,另外。环境变量在make过程中也被解释成make的变量。这些变量是大小写敏感的,一般使用大写字母。Make变量可以做很多事情,例如:i) 存储一个文件名列表;ii) 存储可执行文件名;iii) 存储编译器选项。要定义一个变量,只需要在一行的开始写下这个变量的名字,后面跟一个=号,再跟变量的值。引用变量的方法是写一个$符号,后面跟(变量名)。我们把前面的 makefile 利用变量重写一遍(并假设使用-Wall -O –g编译选项):
OBJS = main.o add.oCC = gccCFLAGS = -Wall -O -gtest : $(OBJS)$(CC) $(OBJS) -o testmain.o : main.c add.h$(CC) $(CFLAGS) -c main.c -o main.oadd.o : add.c add.h$(CC) $(CFLAGS) -c add.c -o add.o
makefile 中还可定义清除(clean)目标,可用来清除编译过程中产生的中间文件,例如在上述makefile文件中添加下列代码:
clean:rm -f *.o
运行make clean时,将执行rm -f *.o命令,删除所有编译过程中产生的中间文件。
不管怎么说,自己动手编写makefile仍然是很复杂和烦琐的,而且很容易出错。因此,GNU也为我们提供了Automake和Autoconf来辅助快速自动产生makefile,读者可以参阅相关资料。
7.小结
本章主要阐述了Linux程序的编写、编译、调试方法及make,实际上就是引导读者学习怎样在Linux下编程,为后续章节做好准备。
原文标题:Linux下用C语言最基本的程序开发与调试
文章出处:【微信号:C_Expert,微信公众号:C语言专家集中营】欢迎添加关注!文章转载请注明出处。
收藏
人收藏
扫一扫,分享给好友
复制链接分享
评论
发布评论请先 登录
相关推荐
C语言常见问题
C语言常见问题
发表于 03-21 14:57 •
1次
阅读
如何从RGBD相机提取像素的深度信息
灰度是描述灰度图像内容的最直接的视觉特征。它指黑白图像中点的颜色深度,范围一般从0到255,白色为2....
机器视觉智能检测 发表于 03-21 13:37 •
101次
阅读
如何将前中后序的递归框架改写成迭代形式
之前经常讲涉及递归的算法题,我说过写递归算法的一个技巧就是不要试图跳进递归细节,而是从递归框架上思考....
算法与数据结构 发表于 03-18 10:13 •
79次
阅读
修改rt_kprintf()函数成为中断方式需要注意什么地方
使用rt-thread-0.2.4版本,在MDK上软件仿真调试STM32F101RB。 初始化USART2工作在中断发送方式,使用消息队列方式...
发表于 03-18 09:27 •
1245次
阅读
RISC-V GNU编译器工具链
这是RISC-V C和 C++交叉编译器。它支持两种构建模式:通用ELF/Newlib工具链和更复杂....
发表于 03-17 16:36 •
16次
阅读
第九章 AVR C语言的应用.PDF
本教程讲解的是AVR C语言编程,包括开发环境、语言语法、特殊用法基础知识的讲解
发表于 03-17 14:21 •
14次
阅读
S7-1200 PLCSIM支持范围
S7-PLCSIM 几乎支持仿真的 S7-1200 和 S7-1200F 的所有指令(系统函数和系统....
机器人及PLC自动化应用 发表于 03-17 10:14 •
163次
阅读
i.MX6ULL驱动开发2—新字符设备开发模板
上篇文章介绍了字符设备的开发模板,但那是一种旧版本的驱动开发模式,设备驱动需要手动分配设备号再使用 ....
码农爱学习 发表于 03-17 09:11 •
1469次
阅读
单片机字符串转各种位宽的函数
十进制数值字符串转各种位宽的整形数据demo
本demo实现了字符串转各种位宽的函数,代码简单效率高,非常适合单片机嵌入式应用。...
发表于 03-16 23:51 •
1057次
阅读
GH集成开发环境和编译器
说实话,以前也用过正版的编译器,我记得之前用过正版的IAR编译器license也没有多贵,而最近用了....
嵌入式程序猿 发表于 03-16 17:08 •
309次
阅读
stm32中常用关键字的使用方法
extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例。
嵌入式应用开发 发表于 03-16 16:35 •
329次
阅读
从yield开始入门python协程
本篇文章会先向你介绍一个陌生的 Python 关键词,他和 return 就像一对新兄弟,有相似之处....
python爬虫知识分享 发表于 03-16 16:20 •
220次
阅读
python创建线程池的两种方法
在使用多线程处理任务时也不是线程越多越好,由于在切换线程的时候,需要切换上下文环境,依然会造成cpu....
python爬虫知识分享 发表于 03-16 16:15 •
212次
阅读
时间序列分析和预测基础理论知识
今天给大家带来一篇实战案例,本案例旨在运用之前学习的时间序列分析和预测基础理论知识,用一个基于交通数....
数据分析与开发 发表于 03-16 14:05 •
152次
阅读
重复值处理的常用方法
重复值处理主要涉及两个部分,一个是找出重复值,第二个是删除重复值,也就是根据自己设定的条件进行删除操....
数据分析与开发 发表于 03-16 13:55 •
157次
阅读
详解golang事务的三种写法
本文中作者展示了 golang 事务的三种写法。
马哥Linux运维 发表于 03-16 08:52 •
176次
阅读
为什么说C语言程序运行时要比其他语言编写的程序快得多
C语言程序运行时要比其他语言编写的程序快得多,因为它“离底层机器很近”,这个说法正确吗?
C语言编程学习基地 发表于 03-16 08:45 •
140次
阅读
C语言如何使用正则表达式
C语言的正则表达式规则,特此跟大家分享。
C语言编程学习基地 发表于 03-16 08:41 •
169次
阅读
VScode编译器如何配置C/C++编译环境
昨天有伙伴私信我,为什么我用C语言写的hello world几行代码,在编译器里面报错了呢?
C语言编程学习基地 发表于 03-16 08:38 •
135次
阅读
Pandas profiling数据库的功能及解决方案
Pandas profiling 可以弥补 pandas describe 没有详细数据报告生成的不....
数据分析与开发 发表于 03-15 16:31 •
338次
阅读
单片机实现24C02存储上次使用中状态的C语言实例
单片机实现24C02存储上次使用中状态的C语言实例
发表于 03-15 14:19 •
27次
阅读
Verilog逻辑设计中的循环语句和运算符
“ 本文主要分享了在Verilog设计过程中一些经验与知识点,主要包括循环语句(forever、re....
FPGA之家 发表于 03-15 11:41 •
187次
阅读
兆声清洗晶片过程中去除力的分析
在半导体器件的制造过程中,兆声波已经被广泛用于从硅晶片上去除污染物颗粒。在这个过程中,平面硅片被浸入....
发表于 03-15 11:28 •
2次
阅读
函数模板与类模板的基本概念及实现原理
[导读] 最近使用C++做些编程,把日常遇到的些比较重要的概念总结分享一下。本文来分享一下模板类的原....
FPGA之家 发表于 03-15 11:21 •
157次
阅读
AbsInt代码安全性能分析套件产品介绍
德国AbsInt公司是专注于安全苛求软件研发、确认、验证和认证的工具链供应商。能够为客户提供较完整的....
经纬恒润 发表于 03-14 15:32 •
234次
阅读
一种软件模拟内核复位的方法
说到复位,我们都不会陌生,对于一个MCU系统,复位电路是必不可少的一部分。复位的种类有很多:上电复位....
中颖电子 发表于 03-14 12:04 •
219次
阅读
25个Pandas实用技巧
假设你将一些数据储存在Excel或者Google Sheet中,你又想要尽快地将他们读取至DataF....
数据分析与开发 发表于 03-14 10:33 •
139次
阅读
C语言使用回调函数模拟委托与反射
函数是C语言的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被....
STM32嵌入式开发 发表于 03-14 10:19 •
139次
阅读
博途V13-调用GRAPH顺控器实例说明
在以下部分中,将在组织块“Main” 中调用 GRAPH FB“GRAPH_Sequence” 并为....
机器人及PLC自动化应用 发表于 03-14 09:59 •
146次
阅读
rt-thread 启动初始化时报错怎么办
hard fault on handler
rt-thread 启动初始化时报错hard fault on handler,只知道是在(*fn_ptr)();调用初始化函数出错,板子换...
发表于 03-14 09:43 •
1280次
阅读
如何使用BERT模型进行抽取式摘要
最近在梳理文本摘要相关内容,翻到一篇19年关于基于BERT模型进行抽取式摘要的老文「BertSu....
深度学习自然语言处理 发表于 03-12 16:41 •
1441次
阅读
第一个C语言编译器的来源
不知道你有没有想过,某种编程语言的第一个编译器是怎么来的呢?这不就是“鸡生蛋,蛋生鸡”的问题吗?
嵌入式ARM 发表于 03-12 12:36 •
676次
阅读
详解C语言中的短路现象
C语言一经出现,就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语....
嵌入式ARM 发表于 03-12 12:23 •
575次
阅读
如何快速学习并精通C语言
学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文....
嵌入式ARM 发表于 03-12 11:59 •
430次
阅读
编写一个简单的C51程序
对于嵌入式系统,如果没有运行RTOS,那么程序开发中的 主函数(main())需要通过某种机制使其永....
嵌入式ARM 发表于 03-12 11:17 •
392次
阅读
C语言操作寄存器的常见手法
使用C语言对寄存器赋值时,常常需要用到C语言的位操作方法。把寄存器某位清零 假设a代表寄存器,....
硬件攻城狮 发表于 03-12 09:06 •
210次
阅读
如何应用Material Design 3和Material You
Material You 是下一代 Material Design 的发展方向,也是一种全新的设....
谷歌开发者 发表于 03-11 10:24 •
229次
阅读
为什么嵌入式开发要选择C语言?
简洁紧凑,使用灵活的语法机制,并能直接访问硬件能够直接访问硬件的语言有:汇编和C语言汇编属于低级语言....
硬件攻城狮 发表于 03-11 10:21 •
170次
阅读
PCB分析常见方法
软件代码有bug,可以通过人工查找,也可以通过编译发现,同时也可以通过代码静态分析工具找到错误或警告....
strongerHuang 发表于 03-10 17:55 •
824次
阅读
C语言有哪些语法技巧和功能
C语言常常让人觉得它所能表达的东西非常有限。它不具有类似第一级函数和模式匹配这样的高级功能。但是C非....
strongerHuang 发表于 03-10 17:42 •
820次
阅读
c语言嵌入式编程
比较详尽的嵌入式C语言解答和分析
发表于 03-10 14:53 •
451次
阅读
使用GoRK3288库的时候需要用到的语法有哪些呢
使用GoRK3288库的时候需要用到的语法有哪些呢?...
发表于 03-10 06:49 •
499次
阅读
C/C++在线编译器的功能
作为程序员,使用编译器是必备技能,但是从入门到放弃,基本上就是在开发环境安装、配置这一步。。。
strongerHuang 发表于 03-09 17:52 •
3367次
阅读
C语言简单模拟委托与简单模拟反射
函数是C语言的核心概念。主调函数(caller)调用被调函数(callee)是一般的调用关系,如果被....
硬件攻城狮 发表于 03-09 17:17 •
3096次
阅读
C语言中内存四区模型的本质区别和代码分析
●数据类型可理解为创建变量的模具:是固定内存大小的别名。
嵌入式ARM 发表于 03-09 14:45 •
256次
阅读
VMA和LMA的基本概念简介与常见问题解析
VMA和LMA的基本概念与常见问题解答
摘要:本文介绍VMA和LMA的基本概念,并针对一些理解过程中的常见疑问做出解...
发表于 03-09 06:45 •
611次
阅读
如何调试TAS5805?
如何调试TAS5805?
发表于 03-09 06:38 •
67次
阅读
如何通过驱动的方式点亮LED灯?
如何通过驱动的方式点亮LED灯?
发表于 03-09 06:34 •
202次
阅读
RK3399 Android 7.1亮度调节的步骤有哪些呢
RK3399 Android 7.1亮度调节的原理是什么?
RK3399 Android 7.1亮度调节的步骤有哪些呢?
...
发表于 03-08 09:20 •
316次
阅读
RK3399 ffmpeg的编译步骤有哪些
RK3399 ffmpeg的编译步骤有哪些?求解答
发表于 03-08 08:30 •
279次
阅读
|