C 语言的编译,干货有点多!

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!

作者|慕课网精英讲师 张磊

今天这篇文章我们来聊聊C 语言的编译器。

每个语言都需要编译器,甚至包括可以直接操作 CPU 内部寄存器的汇编语言。编译器的作用就是将我们用接近人类自然语言编写的程序翻译成计算机可以直接执行的二进制文件。

其实使用二进制是人类在计算机发明过程中妥协于工程实践的一个行为。因为从最高效率的数字进制来说,三进制其实更为有效率,但是实现起来不那么容易。

C 语言的编译器有非常多种,下面我们列举了一些,供大家参考。

当然,编译器还与计算硬件平台息息相关。同一个编译器会因为计算机体系结构不同而分为不同的版本。如 arm64,armhf,x86, x86_64,PowerPC 等等。

我们可以使用 gcc 编译器。同时还可以在 arm64,armhf,x84_64 等硬件平台上编译我们的程序。从中可以看出 C 语言的移植性还是很好的。同样的程序,我们也可以在不同的编译器以及硬件平台上编译执行。

在集成环境中,编译 C 语言一般只需要在菜单中选择 运行 或者 调试运行 即可。也可以通过相关的快捷键来直接编译运行程序。要是只编译不运行,那么里面会有 编译 选项和与之对应的快捷键。这时程序只是编译,并不会运行。

对于初学者来说建议大家不使用 IDE, 而是直接使用文本编辑器来编辑程序。这里建议大家使用微软的 Visual Studio Code, 简称 VSCode。这个文本编辑器,现代,多功能,多种操作系统下都可以使用,功能强大,可以根据自己的需要安装插件扩展功能。

在类 Linux 中编译 C 语言是一件简单的事情。只要打开一个终端窗口安装 gcc 编译器即可。

对于基于 Ubuntu 系统的用户,安装编译所需的软件只需要执行如下命令:

Tips:对于 RPM 包管理的 Linux 发行版(如 CentOS,OpenSUSE 等),会有类似的软件组,只不过名称和安装时所使用的命令不同。

在安装结束后可以查看 gcc 的版本。

会有类似如下的信息输出:

这时候可以把之前一直使用的示例程序编译一下。

实例演示

首先将上面的命令保存为文件名 test.c。

编译 C 语言的命令如下:

这个命令的意思是将 test.c 文件名的程序源码,编译为名称 test 二进制程序。

以前在 Windows 下直接编译 C 语言是一件困难的事情。要么使用诸如 Visual Studio 之类的 IDE,要么安装 Cygwin 这类的模拟环境。

但是在目前 Windows 10 中,现在有了更便捷的选择。可以安装 WSL 环境, 全称为 Windows Subsystem for Linux。大家可以通过搜索上面的关键字来查找安装方式。

在这里我将微软的官方文档链接放在这里,方便大家安装。这里有详细步骤,以及大家在安装过程中会经常遇到的安装问题等。

适用于 Linux 的 Windows 子系统安装指南 (Windows 10)

在选择安装 Ubuntu 后,就可以按照上面在 Linux 环境下编译 C 语言的方式来编译了。

Tips:这时候大家可能很好奇文件路径的问题。在 Windows 10 中的盘符,是挂载在 WSL 系统中 /mnt 目录下的。比如你的用户名叫 mooc,那么你的文档目录下存储了源代码,你要怎么进入 文档 这个目录呢?

cd /mnt/c/Users/mooc/Documents/ 代码块1

C 语言的编译总结起来其实就是,用编译器将源代码,也就是我们可以读懂的程序,翻译成机器可以读懂的机器码。

这个过程需要你做到几点:

  1. 准备编译器;
  2. 准备代码编写工具;
  3. 编写代码;
  4. 通过命令行,使用编译器编译。

当然这是最简单的使用,我们还可以通过工具来进行编译命令行的替代。

欢迎关注「慕课网」,发现更多IT圈优质内容,分享干货知识,帮助你成为更好的程序员!

vs code下编译c++源代码的两种方法

图1 学习编程,改变世界

编译C++代码,需要用到g++.exe编译器。以命令行方式,或者通过vs code菜单,都可以完成编译工作,菜单系统不过是把手工编译转换成菜单方式,简化了命令输入过程。本文就针对两种编译方法,以下面的代码(inputoutput.cpp)为例,做一个分享。

第一种编译C++方法,打开一个新terminal, 在源代码所在目录下,输入g++ inputoutput.cpp进行编译。terminal中的当前目录,必须是C++文件所在目录。

图2 利用vs code菜单系统编译

图2 在terminal中的编译过程

图3 不指定编译生成的文件名,产生一个a.exe 可执行文件

如果指定输出的可执行文件名称,可以这样写: g++ inputoutput.cpp -o myRun

图4 指定编译生成的文件名

可以看到,生成了一个myRun.exe文件。

第二种方法,利用vs code中的terminal菜单中的“Run Build Task”进行编译就(图4,图5)。

图 4 利用菜单中的子菜单项进行编译

图5 选择一个编译器进行编译

选择第二或第三项的g++, 这样,会产生一个同名的可执行文件。

小结:本文分享了两种vs code下编译C++源文件的方法。一种是terminal中命令行方式编译,另一种是利用Run Build Task子菜单进行编译。

带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统

要学习linux内核,先要能够编译内核,还需要了解内核如何启动根文件系统。这样你才能在修改linux内核代码之后,完成验证的过程。

本文教你完成下列过程:

1.下载linux并编译linux内核源码

2.编译busybox

3.制作一个最小的根文件系统

4.qemu启动你编译好的内核和根文件系统

linux源码下载地址:

https://mirrors.edge.kernel.org/pub/linux/kernel/

我选择的版本是:4.9.229

https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.229.tar.xz

下载到本地,解压,然后进入linux-4.9.229目录:

1.指定硬件体系架构。

为了减少安装编译器的过程,我在本例中使用的是x86,因为我的开发环境就是x86。如果你要编译arm的内核,则指定ARCH=arm且需要安装交叉编译器。

2.配置board config,此处配置为 x86_64_defconfig。好了,我们点好菜了,菜单就是x86_64_defconfig

3.配置内核

这一步其实是对第2步的菜单进行微调,我们需要内核支持ramdisk驱动,所以需要选中如下配置:

4.编译内核

编译成功后的内核位于:arch/x86_64/boot/bzImage

下载buysbox源码,下载地址:

https://busybox.net/downloads/

我使用的版本是busybox-1.30.0

1.解压buysbox源码

2.配置buysbox源码

在这里我们把busybox配置为静态编译,这样busybox在运行的时候就不需要额外的动态链接库了。

3.编译和安装

4.编译完成后的busybox就安装在源码根目录下的_install目录了,我们进入_install目录,补充一些必要的文件或目录,相关的shell命令如下:

这样一个最小的、完整的可以被内核启动的文件系统就齐活啦。

制作根文件系统镜像文件。

思路:

1.先制作一个空的镜像文件;

2.然后把此镜像文件格式化为ext3格式;

3.然后把此镜像文件挂载,并把根文件系统复制到挂载目录;

4.卸载该镜像文件。

5.打成gzip包。

最终生成的文件系统镜像名字为:rootfs.img.gz

准备好了内核和文件系统镜像,幸福的一刻马上来临了:

通过qemu模拟器启动我们自己编译的内核和文件系统:

这样一个完整的最小linux系统就起来啦:

好了,经过以上的步骤,你可以自己编译一个内核和文件系统。有了这样的基础,你在之后就可以自由的修改linux内核代码并run起来进行验证啦。

记得关注“技术简说”,持续分享linux内核知识,让你一步一步成为linux内核高手。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。