A0200 安装和使用Cygwin - matianfu/arabesque GitHub Wiki

前言

经过几种不同的配置比较,我强烈建议使用者安装Cygwin;相比于独立安装几个GNU工具、仅提供STM32开发工具链必要的Build功能而言,选择Cygwin有如下原因:

  1. 提供比Windows内置的DOS Shell更易用的Cygwin Shell;

  2. 提供比DOS Shell丰富得多的命令行工具,包括绝大多数Unix常用文件操作命令,文件和字符串处理命令,网络诊断工具,编译和Build工具,源码管理工具等等;

  3. Eclipse/Cygwin提供了一个在PC上编写和调试C/C++程序的工具链和开发环境;对于调试算法和数据结构比在嵌入式目标板上调试更为方便;

  4. 基于Eclipse/Cygwin调试工具链特性更方便;虽然实际用于STM32开发的是GNU交叉编译工具链,但大部分特性都是共有的;

  5. 基于Eclipse/Cygwin调试其他Eclipse功能集成,例如EGit,Mylyn;或第三方Unit Testing工具,例如Unity,CMocka,更为方便;

对习惯于在Windows和IDE里开发的程序员而言,命令行界面(Command Line Interface, CLI)看起来是原始、落后、用处不大、复杂、和难以掌握的。

这种理解有很多地方是错误的;但我也不想在这里宣扬或反对Unix哲学和命令行万能主义。实际的情况是:命令行工具既不象没有接触过他们的开发者想象得那么难,也不象一些坚持使用CLI做一切事情的开发者们认为的那么高效率。这篇教程的策略是:

  • 实用主义至上,针对具体任务,哪个好用用哪个;
  • 对读者的假定是对Unix系统和命令行一无所知,所以最小化命令行的使用,只在非常必要的地方给出相应的命令行实现;
  • 对读者的假定是希望了解一些有用的Unix命令,所以会给出一些很常用和有用的命令例子;
  • 与工具链(GCC/GDB/GDB Server)相关的命令行,与Cygwin/Unix无关,建议开发者多了解一些;

Cygwin简介

Cygwin的官方网站是:

https://cygwin.com/

在页面上提供了关于Cygwin项目的简单说明。

Cygwin是:

  1. 一个软件工具集,包含很多GNU和开源工具;在Windows上提供了Linux发行版上的类似功能;

  2. 一个动态链接库(cygwin1.dll),提供了基础的POSIX API功能;

POSIX是IEEE的一系列标准,主要是为了实现各种Unix操作系统之间的API,Shell,和很多软件工具集的兼容性;

http://en.wikipedia.org/wiki/POSIX

Windows NT内核提供了很多POSIX兼容性;当前版本的Cygwin支持Windows XP SP3以后的所有版本;

Cygwin不是:

  1. 能直接运行Unix二进制程序的Windows环境;如果要运行Unix程序,你必须获得源码在Cygwin下重新编译;

  2. 能奇迹般的让Windows程序获得一些Unix系统上特有的特性,例如信号,伪终端等等;

下载

官网上提供了32bit版(setup-x86.exe)和64bit版(setup-x86_64.exe),根据你的操作系统下载安装。

本教程使用的是32bit版本,Windows 7中文入门版作为示例;同样的安装过程在Windows XP上也验证过。

强烈建议用户把下载的可执行程序放在Windows桌面上或者至少在Windows桌面上放置快捷方式;Cygwin的软件安装采用的是常用的软件池(repository)方式,每次升级、添加或者删除软件,都是运行这个setup程序。

安装

运行安装程序。

alt text

alt text

选择安装目录时建议使用缺省目录,如果要修改位置,切记路径名称符合Unix习惯:只包含英文字母、数字和下划线,不得有中文、其他符号,尤其是空格。

alt text

然后选择Cygwin下载的包文件的存放目录,任何目录都可以,这个目录只有Cygwin的安装程序会访问。

alt text

选择网络连接部分,Cygwin提供了很多的镜像站(包括国内站点),一般安装没有“翻墙”的必要,如果遇到特殊的软件包无法下载,可以考虑使用代理。

alt text

mirrors.163.com是网易的镜像站,在国内,速度很快,推荐选此镜像站;

  • 163镜像可能和主站点同步较慢,我遇到过某些软件报MD5错,这时的解决办法是记下有问题的软件包的完整名字,跳过出问题的软件包安装,先安装完其他的软件包;然后重新启动setup程序,选择北美的镜像站,例如:mirrors.kernel.org,找到出问题的软件包安装;北美的镜像站点下载速度比国内站点慢很多。

alt text

在选择软件包的界面上,可以在Search输入框内输入名字,过滤可选软件包;

  • 这个输入框是随着用户输入字母逐个查找的,查找速度很慢,所以最好是找个记事本软件把完整的名字写进去然后拷贝粘帖进来。

alt text

作为第一个例子,我们可以安装GCC软件包,在Devel分类下,全称是gcc-g++: GNU Compiler Collection (C++),点击Skip或者Binary列的勾选框,Skip会变成软件包的版本(4.8.3-4),点击下一步;

alt text

Cygwin本身具有包管理器功能,选择GCC并不会只安装这一个软件包,而是会自动安装它所依赖的所有软件包;

alt text

alt text

安装完成之后,桌面上出现Cygwin Terminal图标,点击启动Cygwin Shell。

Cygwin的命令提示符显示当前路径是~,在Unix习惯下,这表示是用户的home文件夹;Unix基础命令:

  • cd 表示进入目录(change directory, 和DOS命令一样)

  • ls 列出当前目录下的文件和子文件夹(list, 对应DOS命令的dir),完整列出文件信息可以使用ls -sail

  • pwd 列出当前的完整目录(present working directory)

alt text

可以在Cygwin Terminal里输入:

gcc --version

gcc返回当前的软件版本,这表明在Cygwin里安装gcc软件包成功。

alt text

安装GDB, Make, InetUtils

重复上述过程,安装GDB,Devel分类下的gdb: The GNU Debugger

alt text

安装GNU Make,Devel分类下的make: The GNU version of the 'make' utility

alt text

检查一下coreutils包,应该已经自动安装;Base分类下的coreutils: GNU core utililities; coreutils包包含了Make所需的常用命令,尤其是Eclipse的Build工具所需的rm命令。

alt text

最后安装InetUtils,这个包里包含了常用的网络命令,例如telnet。

alt text

上述安装全部完成之后,检查一下安装结果;打开Cygwin Shell。

gdb --version显示gdb版本号。

alt text

make -v显示make版本。

alt text

telnet --version显示telnet版本。

alt text

如果是Windows XP,Windows有自带telnet命令;如果是Windows 7,缺省安装时Windows内置的telnet命令不可用;用户可以在控制面板->程序->程序和功能->打开或关闭Windows功能中勾选Telnet客户端激活该命令;在我们的配置中,我们选择Cygwin自带的inetutils包,包含telnet, ftp, tftp等常用网络工具。

alt text

  • 使用which命令,可以显示该命令对应的可执行文件的完整路径,如上面的截图中,显示实际生效的telnet命令是/usr/bin/telnet

Cygwin的目录

Unix的文件系统与Windows文件系统

Unix和Windows都使用树状的目录和文件系统结构。

Windows有“盘”(Drive)的概念,每个硬盘分区,包括主分区和扩展分区上的逻辑分区都对应一个盘符,C盘、D盘等等;每个盘有自己的根(root)目录,例如C:\

Unix文件系统没有盘的概念;系统有一个根目录,它可能是一个物理硬盘分区,也可能只是个ramdisk(内存模拟的磁盘分区),表示为/。所有物理硬盘分区(也包括U盘、CD-ROM等)都挂载在某个目录上;挂载和卸载的命令是mountumount;挂载的目录称为挂载点,原则上应该为空目录,

  • 注意Windows使用\符号(backslash)来分割路径中的目录名和文件名;但是Unix使用/作为分割符;在Cygwin上应使用Unix习惯保证程序兼容性。

Unix文件系统有用户权限的概念,但是Windows视文件系统而定,FAT32文件系统是没有用户权限的,NTFS支持用户权限;文件权限对于C语言开发文件I/O程序是必须了解的,但是超过了本文档的范畴,不做多述。

Cygwin/Unix目录树

在Cygwin中,root目录的实际位置是Cygwin的安装目录,缺省是C:\Cygwin

在这个目录下,按照Unix习惯建立了子目录,存储程序和数据文件。

alt text

Unix文件系统对程序的存放位置有一些约定,例如:

  1. /bin目录下是系统基本命令;/usr/bin下为一般的用户使用命令程序;/usr/sbin下是系统管理工具。

  2. /home/<用户名>下是每个用户自己存放程序和文件的地方;用户自建的程序或可执行脚本一般存放在/home/<用户名>/bin目录下。

  3. /lib/usr/lib/usr/local/lib目录下是库文件,在Windows上是dll文件,在Unix上是so文件;在开发程序时,链接程序(Linker)需要知道库文件位置;Cygwin提供的库文件不是Unix共享库,因为Unix和Windows共享库的格式和载入机制均不同,不能互换使用。

  4. /usr/include/usr/local/include是C/C++头文件目录;

  5. /var是存放(临时性的)数据文件的地方,例如打印文件、邮件、临时文件等等;

  6. /etc是存放系统和程序配置文件的地方;

  7. /usr是存放应用程序的地方,很象Windows上的Program Files目录;

开发者通常会在上述的include与lib目录中查找文件,这是编译和链接程序所需要的;这里也可以看出Unix/Linux和C/C++程序开发的紧密结合;在操作系统一级提供开发所需的所有头文件和库文件,绝大多数Unix/Linux发行版缺省提供程序编译工具、Build系统和调试工具,整个操作系统就是一个完整的IDE。作为对比,Windows上的习惯是,这些内容都只在IDE里提供给开发者使用;普通用户没有这些工具。

关于Linux Filesystem Hierarchy的详细定义,可以参阅:

http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/

Cygwin中访问Windows文件系统

在Cygwin的/cygdrive目录下,有用Windows盘符命名的子目录,这些子目录就是Windows驱动器在Cygwin文件系统中的挂载点,例如C盘的位置是:

/cygdrive/c

约定

我们会给出两类demo程序。

一类是运行在Windows上的,基于Eclipse/Cygwin开发的C/C++程序,这类程序我们把源码和工程项目放在Cygwin的目录下,例如:

/home/ma/workspace

使用Windows文件浏览器访问则是C:\Cygwin\home\ma\workspace

这种程序的开发使用的全套Cygwin提供的工具链、Build系统、头文件、库文件和调试程序,使用Cygwin文件路径和Unix习惯比较方便;

另一类程序是使用GNU交叉编译工具链开发的STM32应用,这类开发我们把源码和工程文件放在Windows系统目录下,例如:

C:\User\ma\workspace

这种开发我们仅使用Cygwin所提供的几个基本命令和Build工具(make),其他的交叉编译工具链、调试器、头文件和库文件,均与Cygwin无关。使用Windows路径会更方便。

Eclipse对Cygwin方式和Windows方式均有良好支持。

总结

Cygwin是GNU工具和很多Unix/Linux开源工具移植到Windows平台的工具集,有包管理机制和包安装程序;

通过Cygwin安装了开发C语言程序必要的包,包括gcc, gdb和make;自动安装了coreutils,为了使用方便还安装了inetutils包。

非常简单的介绍了Cygwin/Unix/Linux文件系统和Windows的差异。

⚠️ **GitHub.com Fallback** ⚠️