• 关于Cygwin——包管理、替换默认终端、同MSYS的比较


    (搬运自我在SegmentFault的博客)

    Cygwin 是一个用于 Windows 的类 UNIX shell 环境。 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性;以及 Bash shell 的改写版本和许多 UNIX 实用程序,它们提供大家熟悉的 UNIX 命令行界面。前一个组件是一个 Windows 动态链接库 (DLL)。后一个组件是一组基于 Cygwin DLL 的程序,其中许多是用未经修改的 UNIX 源代码编译的。它们合在一起提供大家熟悉的 UNIX 环境。

    与此同时,MinGW这个项目也在做类似的事情。MinGW是Minimalistic GNU for Windows的缩写。MinGW有一个叫MSYS(Minimal SYStem)的子项目,主要是提供了一个模拟Linux的Shell和一些基本的Linux工具。

    这篇文章指出了二者的区别,学习一下:

    首先MinGW和Cygwin都不能让Linux下的程序直接运行在Windows上,必需通过源代码重新编译。

    现代操作系统包括Windows和Linux的基本设计概念像进程线程地址空间虚拟内存这些都是大同小异的,之所以二者上的程序不能兼容,主要是它们对这些功能具体实现上的差异,首先是可执行文件的格式,Window使用PE的格式,并且要求以.EXE为后缀名。Linux则使用Elf。其次操作系统的API也不一样,如Windows用CreateProcess()创建进程,而Linux使用fork()。

    所以要移植程序必然要在这些地方进行改变,MinGW有专门的W32api头文件,来把代码中Linux方式的系统调用替换为对应的Windows方式。而Cygwin则通过cygwin1.dll这个文件来实现这种API的转换,并模拟一个Linux系统调用接口给程序,程序依然以Linux的方式调用系统API,只不过这个API在cygwin1.dll上,cygwin1.dll再调用Windows对应的实现,来把结果返回给程序。

    可以用查看他们编译好的程序的导入表来验证这点。二者生成的程序都是能在Windows上运行的EXE文件,显然都是PE格式,用一个PE格式查看工具检查一下就能发现,Cygwin生成的程序依然有fork()这样的Linux系统调用,但目标库是cygwin1。而MingW生成的程序,则全部使用从KERNEL32导出的标准Windows系统API。

    要在Cygwin环境中管理软件包,可以使用自带的setup.exe。此外,Cygwin中还有类似于apt-get的包管理器,叫做apt-cyg。这篇文章介绍了apt-cyg的安装和使用。

    Cygwin默认的界面如下:
    请输入图片描述

    很丑,默认不能复制粘贴,需要开启快速编辑模式或者点击左上角,选择编辑。Cygwin官网建议使用MinTTY作为终端工具。MinTTY已经自带,输入mintty进入。

    请输入图片描述

    可以看到,比cmdPowerShell强多了。但怎样将其设置为Cygwin的默认终端?
    参考了这篇文章。在Cygwin目录下打开Cygwin.bat,注释掉bash --login -i,加入下面这句:

    start mintty bash --login -i
    

    (如果你没有将Cygwin目录加到path中,这里要指明路径)如下图。
    请输入图片描述

  • 相关阅读:
    div嵌套出现的样式问题
    知乎最多支持答案的黄色渐隐效果
    对话框图形的css实现方式
    排序算法的相关问题
    数据库优化
    常用的Java基本代码汇总
    浅谈getStackTrace()方法(一)
    ECharts学习总结(三)-----基本概念分析
    ECharts学习总结(二)-----图表组件漏斗图(funnel)
    Echarts学习总结(一)-----柱状图
  • 原文地址:https://www.cnblogs.com/CodeCabin/p/3960881.html
Copyright © 2020-2023  润新知