在Linux下简单编写、编译并执行一个C语言程序

时间:2021-12-11 00:55:36

本文面向第一次在linux尝试写C语言程序的新人。有经验的请绕行。


C语言用法不是本文介绍的关键,本文只是引入如何第一次在linux系统下编写、编译和执行一个简单的c程序。学会后请自行深入。


= 前提基础 =

Linux系统的路径写法有两种,一种是相对路径一种是绝对路径。

绝对路径都是以“/”开头的,比如/usr/bin/vi或者/home/zorro/,代表从根目录"/"开始计算的绝对路径。

相对路径都是不以“/”开头的,不如git/linux/或者work/testplan,代表从当前所在目录开始计算的相对路径,如果想知道你现在所在的目录是什么可以借助pwd命令查看。


你刚刚登陆进来后默认是处在当前用户的家目录的,/home目录下一般存放所有普通用户的家目录(并不是所有的用户都有家目录,也不是限定家目录一定要在/home下)。比如我们在安装系统是创建了一个叫zorro的用户,那么就会存在一个/home/zorro/的目录,/home/zorro目录作为zorro这个用户的家目录,每次登陆zorro用户就会默认从这个目录开始。


linux最最常用的两个命令:cd和ls。

ls的意义是list directory contents。用法是:

ls [option].... [file]...

在linux的文档中中括号代表可选项,没有也可以执行。所以ls命令可以这样用:

1、直接执行"ls",代表查看当前所在目录的内容。如:

在Linux下简单编写、编译并执行一个C语言程序

2、查看某个目录下的内容则在ls后面跟上路径名,路径名可以是绝对路径以可以是相对路径,如:

在Linux下简单编写、编译并执行一个C语言程序

3、想看更详细一点的信息则可以用"-l"(注意是小写的L前面有个减号),linux系统下命令的选项一般都有减号跟着,如下图,可以看到除了内容名字外还有访问权限,属主属组,修改日期等信息。以"d"开头的代表是目录,以"-"开头的代表是普通文件。Linux下有几大文件类型上述是其中最常见的两种,其它的请自行去了解。

在Linux下简单编写、编译并执行一个C语言程序

ls命令还有很多用法,比如-d选项,还有很多别的。具体请运行“man ls”查看,退出查看可按Q键。


cd是一个内建命令,它不是一个单独的可执行文件,它是命令行解释器自带的。cd的用法很简单,就是cd后面接路径名,可以是绝对路径也可以是相对路径,代表进入这个路径。进入某个路径其实就是把这个路径作为当前所在路径,也就是相对路径的起点变了。


关于路径还有两个要说的地方,那就是"."和".."。“.”代表当前路径,".."代表当前路径的上一级目录的路径。比如执行“cd ..”就是退进到上一级目录,如果是"cd ../.."就是当前路径退两级。"ls ../zorro"就是查看上一级目录的zorro的内容。


cd和ls不是任何路径都能进入和查看的,会有访问控制的限制。这个以后再说。


还有几个常用的,touch可用于创建一个普通文件,mkdir可用于创建目录,less可以以只读方式打开一个文件。具体的可参考相应的man文档。


= 编辑器 =

linux下两大编辑器阵营,一个是emacs,一个是vi。不要小看这两大编辑器,它们的功能远远比你一般理解上的编辑器强太多太多倍了。不过本文仅仅就如何简单使用它们编写代码、修改代码并保存。

上文我们说了安装一个Fedora-19系统,下面的描述都是针对Fedora-19的情况下。


== vi ==

vi是Unix的传统编辑器,现在传承到了Linux下。常听到的vim可以理解为vi的升级版,在Fedora下如果你装了vim,那么你执行vi的时候实际上就是执行了vim。

第一步:安装

打开终端,在终端上执行

sudo yum install vim

回车,如果网络良好,yum会帮你计算安装包依赖然后给你一个需要安装的包列表,你只需要输入“y”回车就行了。如果一切顺利vim就已经安装到系统中了。


第二步:编辑

在终端执行

vi hello-vi-world.c

就会进入vi的界面

在Linux下简单编写、编译并执行一个C语言程序

现在还不能编辑,要想进入编辑模式需要按"i"键,按下之后进入插入内容的模式,会看到最下方出现“插入”或"INSERT"的字样:

在Linux下简单编写、编译并执行一个C语言程序

人啊后就可以开始编辑了,怎打字就不用多说了吧,比如写一个最简单的C程序

在Linux下简单编写、编译并执行一个C语言程序

现在还内容还没有被写到文件里,如果想要保存则按照如下步骤进行:

1、按Esc键退出编辑模式。

2、输入一个":"冒号键,在左下角出现一个冒号。

3、输入一个"w"键,然后回车。你会看到下方提示已经written,说明保存成功了,这个文件也被自动创建。

如果要退出vi编辑器则把第三步的w换成q回车就退出了。

如果第三步想要保存退出,冒号后面写"wq"回车就行了,代表保存然后退出。或者直接写"x"回车也代表保存退出。


顺带说一下,如果你装了中文输入法是可以使用的。Fedora-19的默认切换输入法组合键是Alt+shift,或者你手动去点右上角下图的位置去选择:

在Linux下简单编写、编译并执行一个C语言程序


== emacs ==

安装emacs编辑器可以执行:

sudo yum install emacs

输入口令,然后y确认。


emacs编辑器是由开源软件的精神领袖Richard Stallman编写的,功能也非常强大。

在终端输入

emacs hello-em-world.c &

就会看到emacs启动后的界面

在Linux下简单编写、编译并执行一个C语言程序

看到上下两部分,上部分是编辑的地方,下面是一个欢迎界面可以通过配置默认去掉它。手动去掉可以把光标放到上半部分,然后敲击Ctrl+x然后松手后再敲击“1”,这样就只能看到当前光标所在的编辑缓冲区了。注意Ctrl+x是一个常用的前缀组合键。

现在开始编辑,编辑一个简单的C程序,如下:

在Linux下简单编写、编译并执行一个C语言程序

现在内容还是在缓冲区中,如果要保存可以使用组合键Ctrl+x然后再输入Ctrl+s,保存当前文件。

如果要退出则按:Ctrl+x然后再按Ctrl+c。这样就退出emacs了。


= 编译 =

Linux下的常用编译器就是gcc系列,C++的是g++。如果你还没安装gcc则需要安装:sudo yum install gcc。


安装完后我们尝试对上面两个程序分别进行编译,如果要将hello-vi-world.c编译成可执行二进制文件,则执行:

gcc -o hello-vi-world hello-vi-world.c -Wall

如果没有语法错误就编译好了,我们用ls看一下。

在Linux下简单编写、编译并执行一个C语言程序

看到一个带"x"权限(可执行权限)的绿色文件(不一定会显示颜色)。下面尝试执行一下试试,执行谁只要在终端上输入要执行的文件的路径名即可,比如输入./hello-vi-world(注意前面一个点),代表执行当前路径下的hello-vi-world文件。

在Linux下简单编写、编译并执行一个C语言程序

可以看到执行后输出的结果,可以自己尝试编译并执行hello-em-world.c。


gcc其实有很多很多功能,比如要想预编译hello-em-world.c文件可以执行

gcc -o hello-em-world.i hello-em-world.c

执行成功后就会出现一个hello-em-world.i的文件,可以用less,vi或emacs查看一下它的内容,就是经过预编译后的内容。


如果要进行编译,这里说的编译是纯粹的编译,就是把c代码编译成汇编代码,则可以执行:

gcc -S -o hello-em-world.s hello-em-world.i

把.i文件写为hello-em-world.c也行,就是跳过手动预编译直接完成预编译和编译两个过程。这时会得到一个hello-em-world.s文件,打开看一下,里面是编译好的使用于当前体系结构的汇编代码。


把汇编代码进行汇编可以执行:

gcc -c -o hello-em-world.o hello-em-world.s

把.s文件换成.c也行,就是自动完成预编译、编译和汇编三个过程。现在得到一个hello-em-world.o文件,这一个二进制文件,但不是最后的可执行二进制文件,因为它还缺少最后一步连接处理。


最后对.o文件进行连接,我们这里就一个.o文件所以简单,经常是需要有多个.o文件需要连接。连接执行:

gcc -o hello-em-world hello-em-world.o

如果把最后的.o文件写成.c,那就和最开始我们用hello-vi-world.c编译时示范的那样了。实际上那样是完成了预编译、编译、汇编和连接一连串的过程。


好了,现在执行一个最后的编译结果吧。


gcc可以支持很多平台,刚才示范的是通用PC下的gcc编译,你还可以交叉编译,使用gcc针对arm或者avr或者其它平台的版本。这个就自己去研究吧。


想了解更多gcc的只是可以到GNU的网站上去看看。


顺带提一下gdb是常用的调式软件,如何使用gdb调式gcc编译出来的程序请自行学习。可能我会在后面略微介绍。


内容粗糙简陋,全在抛砖引玉。想学习就自己去深入理解吧,编辑器不用两个都很熟,选择其中一个用熟了就行了。