本节旨在帮助你在计算机上运行你的第一个C程序,实践从编写源代码、编译和链接运行的全过程。如果你有《C Primer Plus》或者《C++ Primer Plus》,可以配合它们的第1章一起食用,它们在一起有助于消化。
用C语言组织你的程序,需要经过编写源代码、编译和链接源代码,运行程序三个步骤。源代码能够编译之前,我们必须准备一个编译器。
如果觉得下列步骤繁琐,请使用Visual Studio或其他集成开发环境(IDE),集成开发环境帮你打点琐碎的事务,可以最大限度地节约你的时间。有关VS的详细信息将在随后的有关集成开发环境的博文中介绍。但使用VS之前,我建议你按照下面的步骤尝试一下。在我们使用便捷的IDE之前,先来了解一下IDE在后台默默地为我们干了什么。
STEP 0 准备编译器
为什么需要编译?
这一小节介绍了一点理论知识。我在这里给出我的理解,这个理解可能不是很准确,但是可以帮助理解。有想法或者有更好的理解请在评论处提出?。你可以跳过这一部分。THX!
现代计算机都符合通用图灵机的定义。在图灵模型中,计算机输入数据,根据预设的程序处理数据,最后输出数据。只有符合特定意义的二进制序列才能作为计算机中央处理器可接受的程序。执行一定功能的二进制序列,或称“机器语言”,在每种型号的CPU上都不尽相同。因此,如果用机器语言编写程序,就必须为每种型号的CPU编写程序,为一个CPU写的程序不能直接应用到另一个CPU上。不仅仅是CPU需要程序来处理数据,计算机系统底层的输入输出设备也需要一定的组织和协调才能正常发挥功能。
为了组织和协调计算机底层的设备,操作系统软件出现了。编写操作系统的程序员负责编写对CPU和底层设备能识别的二进制序列,而编写在操作系统上运行的软件的程序员就可以不用理会底层的二进制,而是去编写操作系统能够识别的代码,操作系统再将这些编码转换为CPU能够识别的二进制序列。
我们常用的操作系统是微软公司的Windows系列操作系统以及Liunx这一类操作系统。这样又出现一个问题:Windows能识别的代码Linux系统不能识别。如果想让程序在这两种操作系统上运行,就必须分别为这两种操作系统编写程序。这并不划算。另一点,有些程序,比如在显示器中输出一行字符经常重复地被编写,如果能就想办法渐少编写这样重复的程序将提高编程的效率。
C语言通过引入标准库以及编译和链接的机制解决了上述问题。标准库中包含了包含了经常重复使用的代码,程序员要使用这些代码只需要引用即可,无须自己编写。要使自己的C语言程序能够运行,程序员先以C语言的语法写好源代码,这种源代码可以被C语言的编译器编译成目标代码。目标代码生成后,链接器将目标代码和对应操作系统的启动代码以及标准库中的代码(库代码)结合起来,生成可执行的文件。现在,编译和链接通常简称编译。C语言源代码不经修改或是少量修改就能在不同的操作系统上编译和运行,这是C语言的跨平台特性。
C++在C语言的基础上引入了更多内容,减少了一些内容,在保留了C语言的许多特性的同时引入了面向对象编程等新特性。编译和链接的机制没有改变[1]。
选择一个编译器
在CPP Reference网站中可以了解到编译器对C/C++语言标准的支持情况。常见的对C语言支持较好的编译器有GCC, clang 以及MSVC。MSVC是微软Visual Studio的编译器,关于Visual Studio的内容我们放到IDE的部分。现在,我们重点关注GCC,顺便提及Clang和MSVC。你可以选择GCC,Clang和MSVC中的一种安装。本文只详细介绍了GCC的安装和编译方式。GCC有多种安装方式,选择其中一种安装方式即可。
Option 1: GCC
https://gcc.gnu.org/
GCC全称“GNU Compiler Collection”,最初是为GNU操作系统(Linux是GNU操作系统其中的一种[2])编写的。官方并不提供Windows上的编译器。在开源社区的努力下,有些项目实现了Windows上的GCC,使我们可以在Windows上使用GCC来编译C/C++的源代码。这些第三方项目有Cygwin, MinGW以及从MinGW派生的mingw_w64[3]。只要选择一个项目就能运行GCC编译器。(这些项目对于入门使用而言没有任何区别,我推荐使用MinGW[4],它对初学者更友好。)
Choice 1: Cygwin
https://www.cygwin.com/
在Cygwin项目的官网可以获得可以直接安装的版本,点击这里转到下载页面。选择最新稳定版本的Cygwin安装即可。选择对应操作系统位数的安装程序下载。这个安装程序实际上是个下载器,它会自动根据你选择的组件从网络上下载需要的文件。在Cygwin发布新版本后,也可以通过这个小程序来更新已经安装的组件。
我为Cygwin单独写了安装指南,请移步GCC Via Cygwin查看。完成安装后请返回这篇文章进行STEP 1。
Cygwin: Get that Linux feeling – on Windows
Choice 2: MinGW
http://www.mingw.org/
如果你决定使用MinGW环境,我推荐你使用Choice 3中的mingw_w64环境,而不是MinGW。下面是MinGW的安装指南。
在SourceForge网站上可以获取到最新的MinGW(请注意截止至2017年8月,MinGW已经超过两年没有重大更新了,因此我推荐使用mingw_w64项目)。可以选择下载“Installer”文件夹下的“mingw-get-setup.exe”,这是一个下载器程序,会自动根据我们的需求从网络上下载对应的文件,十分方便。
下载之后以管理员身份运行mingw-get-setup.exe。
确认之后请点击“Install”进行下一步。
这一步要求你选择安装MinGW的位置。可以保持默认位置,也可以更改到你认为合适的位置。推荐勾选安装UI Interface,这会便捷日后的操作。推荐为所有用户安装(如果看见“…for all users * ….”不可勾选,则可能是因为你没有以管理员身份运行它。)最后确认在开始菜单或者在桌面上创建快捷方式。确认选择后请按“Continue”进行下一步。
等待下载过程完成。完成后请按“Continue”确定,程序为自动为你打开MinGW安装管理器。
我们要在这一步选择需要的组件,这里我们需要选中“developer-toolkit”和“mingw32-gcc”。选择的方法是点击列表中项目前面的方框,在浮出的菜单中选择“Mark for installation”,这时候方框上面应该出现截图上的标志。
完成之后点击工具栏的“Installation”,点击“Apply Changes”或“Update Catalogue”。程序会自动下载和部署。
请耐心等待安装完成,安装完成之后可以关闭对话框。
安装完成后,请转到安装MinGW的位置中的bin文件夹(如:“C:\MinGW\bin”),确认文件夹中存在“gcc.exe”。然后,将bin文件夹所在目录添加到Path变量中,方便我们的后续操作。
你可能想测试一下Mingw有没有安装成功,可以在Windows命令行工具中使用下面的命令测试:gcc –version 。如果GCC的版本信息,说明gcc安装成功了。如果提示“找不到gcc”,很可能是你的Path变量没有正确设置。(命令行工具不会自动读取新设置的Path变量。如果你调整了Path变量,请重启命令行工具,让它读取新的Path变量。)
恭喜你,现在可以进行STEP 1了。
Choice 3: mingw_w64
http://mingw-w64.org/doku.php
mingw_w64是MinGW的派生项目,为在Windows上编译64位程序和解决MinGW的过时设计而生。mingw_w64本身不提供预先编译好的可执行程序,这里我们使用Mingw-builds来完成安装。Mingw-builds的安装非常简单,它会自动为我们选择好组件。
这一步我们可以按需对mingw_w64做一些调整,这些参数其实对初学者没有任何区别。随着学习过程的深入,还可以很方便地调节这些参数。推荐保持默认不变,默认的参数是适合多数人的最佳实践。
这一步提示我们选择好安装位置,以及是否在开始菜单中创建快捷方式。确认之后,安装程序会自动下载需要的文件,整个安装过程是全自动的。
完成安装后,将mingw_w64的对应架构的bin目录添加到Path变量中(如:C:\Program Files (x86)\mingw-w64\i686-7.1.0-posix-dwarf-rt_v5-rev1\mingw32\bin ,注意此处的bin目录是含有gcc.exe的目录)。
在Windows命令行工具中测试gcc是否安装成功,可以使用下面的命令:gcc –version 。若显示GCC的版本信息则表示GCC安装成功了。如果显示“找不到GCC”,则可能是你的Path变量没有正确配置。(命令行工具不会自动读取新设置的Path变量。如果你调整了Path变量,请重启命令行工具,让它读取新的Path变量。)
如果一切顺利,恭喜你,你可以进入STEP 1了!
Option 2: Clang
http://clang.llvm.org/
GCC之外的另一个选择是Clang。从直观的感觉来看,Clang与GCC最大的不同是,Clang除了在编译时拒绝有问题的源代码之外,还会建议你可能出错的地方。这对初学者尤其有用。
在这里我不打算介绍Clang的安装过程,因为它它它它在Windows上的安装和设置是实实在在太太太太复杂了QAQ!!!但记住Clang这个名字,以后我们会越来越多地听说它。
(如果你还想尝试,用搜索引起搜索“clang+windows”可能会得到一些有用的信息)
Option 3: MSVC
http://landinghub.visualstudio.com/visual-cpp-build-tools
MSVC,或称Visual C++ Build Tools,原本是微软Visual Studio的一个组件,现在微软提供了它的独立版本。可以利用这个编译器来编译C/C++程序。具体信息请看微软MSDN。
STEP 1 编写源代码
希望你没有被繁琐的编译器安装吓到,那绝对不是编程的乐趣。下面才是真正的乐趣所在。这里我提供一个源代码。你也可以用自己书上的源代码。你也可以自己写一个源代码。
C风格:
// hello.c #include <stdio.h> /* This is a simple C source file to be complied */ int main(void) { printf("Hello C Programing."); return 0; }
C++风格:
// hello.cpp #include <iostream> /* This is a simple C++ source file to be complied */ int main() { std::cout<<"Hello C++ Programing."; return 0; }
可以很简单地完成这一个步骤,你只需要打开你的文本编辑器并复制粘贴上面的代码,如果你喜欢,你也可以体验一下手动输入代码的感觉。(在这里我们最后一次墙裂推荐你使用Windows文本编辑器以外的文本编辑器来编写你的代码,请参考下面的效果截图)
将上面源代码文件保存为“hello.c”(C语言风格)或“hello.cpp”(C++风格)。
STEP 2 编译
保存好文件之后就可以使用编译器了,如果使用GCC作为编译器,那么编译的方法是:
# 编译C语言源文件使用gcc,编译C++使用g++ gcc hello.c -o hello.exe g++ hello.cpp -o hello++.exe
如果编译过程正常,应该出现hello.exe和hello++.exe两个可执行文件。
STEP 3 运行
可以在命令行工具中运行可执行文件:
.\hello.exe .\hello++.exe
程序应该可以正常输出。
欢迎你进入编程世界! <( ̄︶ ̄)↗[GO!]
(提示:如果你想分享编译出来的可执行文件给其他人,请给编译器附加–static 参数,如gcc hello.c –static 。这使编译器静态编译可执行文件,使编译的结果可以脱离MinGW环境独立运行。)
[1] 在计算机和编程语言发展的过程中,编译和链接的机制在表面上没有改变,但编译器发生了很多变化。不断有旧的编译器被新的编译器取代,也不断有新的编译机制优化取代旧的编译机制。实际上,编译器已经发生了多次翻天覆地的变化。
[2] Linux and the GNU System – GNU Project
[3] Installing GCC – GNU Project
[4] 简单来说。Cygwin致力于在Windows上面模拟Linux的环境,使得原本为Linux写的程序在Windows上能不加改动地运行。MinGW则将原本为Linux的写的程序中队Liunx系统的调用翻译为原生的Windows系统调用。我们初学C/C++语言时不涉及对Linux系统的调用,因此使用Cygwin或MinGW没有区别。考虑到易用性,使用MinGW环境更方便。详细信息请看在这一段知乎上的讨论。
[5] 关于mingw_w64安装时的参数选择,请参考 Thread的不同 和 Exception的不同。
发表回复