在 Linux 系统中,我们常用 gcc/g++ 来作为 c/c++ 的编译器,尽管在 Windows 系统中更多地会选择 VS,仍然不妨碍那些 gcc 派的人们继续使用他们钟爱的编译器。此外,对于那些习惯了使用界面操作在 VS 下面进行程序编译的人来说,恐怕不知道 VS 还有类似于 gcc 这样的命令行编译方式。这篇文章将介绍 gcc 和 cl 在 windows 系统中的使用方法,后者即是 VS 真正的编译工具。
一、如何在 windows 系统中使用 gcc?
安装 gcc 的方法非常简单,可以按照下面的步骤进行操作:
- tdm-gcc (jmeubank.github.io) 这是 tdm-gcc 的官方网站,读者可以前往该网站下载 gcc 安装包。
- 在将 gcc 安装完之后,要把 gcc.exe 所在路径添加到系统的环境变量中。
完成上面两步之后,打开 windows 的 PowerShell,输入 gcc -v,如果能看到 gcc 的版本信息就说明 gcc 的安装是没有问题的。如下图所示:
windows 系统中 gcc 的使用方法和 Linux 系统中没有什么区别,这里就不介绍了。
二、什么是 cl?
cl.exe 是 VS 的编译器,用来编译 c/c++ 代码。在平时使用 VS 编译代码的时候,VS 就会调用这个命令帮我们解决所有的问题。实际上,除了 cl.exe 之外,还有 link.exe 一起工作,后者可以将 cl.exe 编译产生的 obj 文件以及一些库链接起来,生成可执行文件。如果读者打开 filename.log (filename 是自己创建的工程名) 的话,就会看到在文件中记录了 VS 使用这两个命令对源代码进行编译、链接的过程。
如果想在 windows 的 powershell 中使用这两个命令对 c/c++ 代码进行编译、链接,需要对环境变量进行一番配置,可以按照以下步骤进行操作:
- 假设本小姐的 cl.exe 和 link.exe 文件在 D:\SoftWare\VS2010\VC\bin 路径下,首先将这个路径添加到 Path 变量中,在这个路径下不仅有 cl.exe 和 link.exe,还有 nmake.exe (这个可执行文件是编写 makefile 的,其地位类似于 Linux 系统中的 GNU make,后面的文章中会介绍)。
- 然后将 D:\SoftWare\VS2010\VC 和 D:\SoftWare\VS2010\Common7\IDE 也添加到Path变量中。前一个路径下有 vcvarsall.bat 文件,后一个路径下有 mspdb100.dll 文件。如果不添加后一个路径,在使用 cl.exe 编译代码的时候会报“无法找到 mspdb100.dll”的错误。网络上给出的方法大都是将该文件复制到 cl.exe 相同的目录下,但是这不能从根本上解决问题,最好还是将 mspdb100.dll 所在的路径添加到环境变量中。
- 在环境变量中新建 INCLUDE 变量,将 D:\SoftWare\VS2010\VC\include 和 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include 添加到这个变量中。它们分别代表了 VS2010 所包含的头文件和 Windows 系统所包含的头文件。
- 在环境变量中新建 LIB 变量,将 D:\SoftWare\VS2010\VC\lib 和 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib 添加到这个变量中。它们分别代表了 VS2010 运行时需要链接的库和 Windows 系统所拥有的库。
特别需要注意的是,在第3步和第4步中,VS2010 相关的 include 以及 lib 必须要在 windows 系统相关的 include 和 lib 前面,否则,在编译的时候会显示找不到 c/c++ 的标准头文件,或者找不到 c/c++ 的标准函数库。
在这一系列过程都结束了之后,打开powershell,输入cl,如果不产生警告,并且出现下图所示的文字,就表示环境变量的配置是没有问题的。
现在写一个 hello world 的程序测试下,假设这个源代码的文件名叫做hello_world.c,那么可以在 PowerShell 中使用 cl hello_world.c 命令编译该文件,默认情况下会生成 hello_world.exe 可执行文件。当然,这个可执行文件名是可以指定的,运行结果如下图所示:
这种编译方法是不是和 gcc 很像呢?使用命令行编译的方便之处在于,当在程序中需要输入命令行参数, 且每次执行程序的命令行参数都不一样的时候,就不需要每次都去 VS 里面进行设置,只需要在运行可执行文件的时候将命令行参数传递进去就好了。与 gcc 一样,cl 也有非常多的编译选项,比如如果在上面的命令中加入 -nologo 和 -Fe 选项,就可以在编译的时候不显示 VS 的版本信息,并且可以指定可执行文件名,就像下面展示的这样:
更多的有关 cl 编译器的选项可以在网络上找到,虽然关于环境变量的配置部分比较复杂,并且也有其他的不需要自己配置环境变量的方法。但是配置环境变量可以一劳永逸地解决“cl.exe 不是内部或外部命令”这个问题。有了 cl 命令之后,就可以着手准备编写 Makefile 了,在以后的文章中,本小姐会对这块内容进行介绍。