热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在Linux环境中高效地创建、编译与运行C语言代码

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

本文面向第一次在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",代表查看当前所在目录的内容。如:

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

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

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的界面

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


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

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

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

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

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

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

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


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


== emacs ==

安装emacs编辑器可以执行:

sudo yum install emacs

输入口令,然后y确认。


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

在终端输入

emacs hello-em-world.c &

就会看到emacs启动后的界面


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

现在开始编辑,编辑一个简单的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看一下。


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


可以看到执行后输出的结果,可以自己尝试编译并执行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编译出来的程序请自行学习。可能我会在后面略微介绍。


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







推荐阅读
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • cJinja:C++编写的轻量级HTML模板引擎
    本文介绍了cJinja,这是一个用C++编写的轻量级HTML模板解析库。它利用ejson来处理模板中的数据替换(即上下文),其语法与Django Jinja非常相似,功能强大且易于学习。 ... [详细]
  • 1、字符型常量字符型常量指单个字符,是用一对单引号及其所括起来的字符表示。例如:‘A’、‘a’、‘0’、’$‘等都是字符型常量。C语言的字符使用的就是 ... [详细]
  • C语言实现推箱子游戏的完整代码
    本文详细介绍了如何使用C语言在Linux环境下实现一个简单的推箱子游戏,包括游戏的基本规则、地图设计及代码实现。适合C语言初学者学习。 ... [详细]
  • LCUI 2.1.0 版本现已推出,这是一个用 C 语言编写的图形用户界面开发库,适合创建轻量级的桌面应用程序。此次更新包括多项修复和功能增强,并正式宣布将启动 Android 支持的开发计划。 ... [详细]
  • Python基础教程:struct模块与格式化字符详解
    本文详细介绍了Python中struct模块的功能,以及如何利用格式化字符实现Python与C语言结构体之间的数据转换。文章通过具体实例讲解了struct模块的主要方法及其应用场景。 ... [详细]
  • 精通C++并非易事,为何它比其他语言更难掌握?这主要归因于C++的设计理念,即不强迫用户接受特定的编程风格或限制创新思维。本文探讨了如何有效学习C++,并介绍了几本权威的学习资源。 ... [详细]
  • Lunix历史及如何学习
    1.Lunix是什么1.1Lunix是操作系统还是应用程序Lunix是一套操作系统,它提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构, ... [详细]
  • #print(34or4 ... [详细]
  • 本文详细介绍了如何检查和配置电脑上的PHP环境,包括位数、运行支持以及文件格式的打开方式。适合初学者了解PHP的基础知识和操作方法。 ... [详细]
  • 构建一个可扩展的插件系统是软件开发中的重要任务。本文将探讨实现这一目标的关键步骤和最佳实践,包括模块化设计、接口标准化、动态加载机制以及安全性考量,旨在帮助开发者打造高效、灵活且安全的插件架构。 ... [详细]
author-avatar
当我繁华尽落_821
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有