zoukankan      html  css  js  c++  java
  • Windows上的gcc

    在Windows上安装gcc,gcc官网上推荐我们了两种方式:

    当然,除此之外还有其他的方式,我们先从mingw开始理解。

    mingw-64

    “GCC for Windows 64 & 32 bits”,也就是说mingw是在Windows下把gcc的源代码移植windows api,让我们在Windows上也可以用gcc编译c代码,gcc与操作系统的api交互的地方mingw都与Windows API做了兼容处理。
    所以说,mingw的gcc编译出来的c/c++程序是可以原生在Windows上执行的。
    注意mingw很多时候只做代码工作,发布编译好的gcc.exe会很懒,经常找不到合适的版本,除非自己下载源代码编译。
    mingw-64是mingw的升级版,后边说道的mingw,都是指mingw-64。
    mignw-64的官网 https://www.mingw-w64.org/

    总结一下:mingw的工作是集成gcc源码与Windows API,用于把gcc移植到Windows上用原生的方式编译程序。用得到的gcc.exe编译的程序可以在Windows上原生运行。他们命名方式一般如下:

    之所以有这么多,首先是gcc支持各种平台,比如arm上的Windows,再就是交叉编译,还有一个重要原因是链接库的不同。
    比如光c语言的标准库就有2套,msvcrtucrt,前者是微软在win10之前做的一个c标准库实现,后者是win10上做的一个c标准库实现。msvcrt对c99支持好像不太好。具体差别可以看这里 https://www.msys2.org/docs/environments/
    c++的标准库也有好几个实现,有苹果的libc++还有gnu的libstdc++
    这些库与gcc编译器的链接就有不同的组合,于是就有了这么多的gcc版本,举个例子mingw-w64-x86_64-gcc就是gcc msvcrt libstdc++的组合,面向的平台是x86_64

    再总结一下:mingw只做编译器的搬运工,各编译如上图所示

    cygwin的gcc

    cygwin项目做的是把Windows api伪装成linux api,一旦这个工作做完了,原本在linux能跑的程序就可以直接在Windows上跑,这其中就包括gcc。
    所以cygwin的核心工作是做一个cygwin1.dll,除此之外他们还做了更多的工作,把很多软件也编译成exe让我们在Windows上开箱即用(gcc也在其中),这些软件的共同点就是:都依赖于cygwin1.dll。

    总结一下:cgywin更像是做了一个软件包的集合,这里包含了很多从linux上移植过来的软件,这些软件都需要依赖cygwin的核心组件cygwin1.dll
    cygwin与mingw不同,mingw一般是只开发代码,偶尔提供编译好的gcc.exe打个包发布,而cygwin则更勤快一些,提供了编译好的exe。
    更重点来了:cygwin的软件包里,还包含了mingw的gcc。也就是说cygwin软件包里包罗万象,不只有依赖cygwin1.dll的gcc还有mingw的gcc(编译原生Windows程序而不依赖cygwin1.dll)。如下图所示:

    msys2

    msys2就复杂的多了,mingw-64只做单体gcc编译器,cygwin则是一个包括mingw-gcc的软件包,而msys2更像是cygwin的加强版,他的优点如下:

    • msys2做了一个msys-2.0.dll,我们完全可以把这玩意想象成cygwin1.dll
    • msys2用包管理pacman,这就比cygwin方便得多。
    • msys2还包含了mingw-64的gcc编译器。
    • msys2包含的软件很多很多。
      在msys2上搜索gcc可以得到如下:
    mingw32/mingw-w64-i686-arm-none-eabi-gcc 10.1.0-2 (mingw-w64-i686-arm-none-eabi-toolchain)
        GNU Tools for ARM Embedded Processors - GCC (mingw-w64)
    mingw32/mingw-w64-i686-avr-gcc 8.4.0-4 (mingw-w64-i686-avr-toolchain)
        GNU compiler collection for AVR 8-bit and 32-bit microcontrollers (mingw-w64)
    mingw32/mingw-w64-i686-gcc 10.3.0-5 (mingw-w64-i686-toolchain)
        GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
    mingw32/mingw-w64-i686-gcc-ada 10.3.0-5 (mingw-w64-i686-toolchain)
        GNU Compiler Collection (Ada) for MinGW-w64
    mingw32/mingw-w64-i686-gcc-fortran 10.3.0-5 (mingw-w64-i686-toolchain)
        GNU Compiler Collection (Fortran) for MinGW-w64
    mingw32/mingw-w64-i686-gcc-libgfortran 10.3.0-5 (mingw-w64-i686-toolchain)
        GNU Compiler Collection (libgfortran) for MinGW-w64
    mingw32/mingw-w64-i686-gcc-libs 10.3.0-5 (mingw-w64-i686-toolchain)
        GNU Compiler Collection (libraries) for MinGW-w64
    mingw32/mingw-w64-i686-gcc-objc 10.3.0-5 (mingw-w64-i686-toolchain)
        GNU Compiler Collection (ObjC,Obj-C++) for MinGW-w64
    mingw32/mingw-w64-i686-libgccjit 10.3.0-5 (mingw-w64-i686-toolchain)
        GNU Compiler Collection (libgccjit) for MinGW-w64
    mingw32/mingw-w64-i686-perl 5.32.1-4
        A highly capable, feature-rich programming language (mingw-w64)
    mingw32/mingw-w64-i686-riscv64-unknown-elf-gcc 10.1.0-2 (mingw-w64-i686-riscv64-unknown-elf-toolchain)
        GNU Tools for RISC-V Embedded Processors - GCC (mingw-w64)
    mingw64/mingw-w64-x86_64-arm-none-eabi-gcc 10.1.0-2 (mingw-w64-x86_64-arm-none-eabi-toolchain)
        GNU Tools for ARM Embedded Processors - GCC (mingw-w64)
    mingw64/mingw-w64-x86_64-avr-gcc 8.4.0-4 (mingw-w64-x86_64-avr-toolchain)
        GNU compiler collection for AVR 8-bit and 32-bit microcontrollers (mingw-w64)
    mingw64/mingw-w64-x86_64-gcc 10.3.0-5 (mingw-w64-x86_64-toolchain)
        GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
    mingw64/mingw-w64-x86_64-gcc-ada 10.3.0-5 (mingw-w64-x86_64-toolchain)
        GNU Compiler Collection (Ada) for MinGW-w64
    mingw64/mingw-w64-x86_64-gcc-fortran 10.3.0-5 (mingw-w64-x86_64-toolchain)
        GNU Compiler Collection (Fortran) for MinGW-w64
    mingw64/mingw-w64-x86_64-gcc-libgfortran 10.3.0-5 (mingw-w64-x86_64-toolchain)
        GNU Compiler Collection (libgfortran) for MinGW-w64
    mingw64/mingw-w64-x86_64-gcc-libs 10.3.0-5 (mingw-w64-x86_64-toolchain) [已安装]
        GNU Compiler Collection (libraries) for MinGW-w64
    mingw64/mingw-w64-x86_64-gcc-objc 10.3.0-5 (mingw-w64-x86_64-toolchain)
        GNU Compiler Collection (ObjC,Obj-C++) for MinGW-w64
    mingw64/mingw-w64-x86_64-libgccjit 10.3.0-5 (mingw-w64-x86_64-toolchain)
        GNU Compiler Collection (libgccjit) for MinGW-w64
    mingw64/mingw-w64-x86_64-perl 5.32.1-4
        A highly capable, feature-rich programming language (mingw-w64)
    mingw64/mingw-w64-x86_64-riscv64-unknown-elf-gcc 10.1.0-2 (mingw-w64-x86_64-riscv64-unknown-elf-toolchain)
        GNU Tools for RISC-V Embedded Processors - GCC (mingw-w64)
    ucrt64/mingw-w64-ucrt-x86_64-gcc 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
        GNU Compiler Collection (C,C++,OpenMP) for MinGW-w64
    ucrt64/mingw-w64-ucrt-x86_64-gcc-fortran 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
        GNU Compiler Collection (Fortran) for MinGW-w64
    ucrt64/mingw-w64-ucrt-x86_64-gcc-libgfortran 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
        GNU Compiler Collection (libgfortran) for MinGW-w64
    ucrt64/mingw-w64-ucrt-x86_64-gcc-libs 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
        GNU Compiler Collection (libraries) for MinGW-w64
    ucrt64/mingw-w64-ucrt-x86_64-gcc-objc 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
        GNU Compiler Collection (ObjC,Obj-C++) for MinGW-w64
    ucrt64/mingw-w64-ucrt-x86_64-libgccjit 10.3.0-5 (mingw-w64-ucrt-x86_64-toolchain)
        GNU Compiler Collection (libgccjit) for MinGW-w64
    ucrt64/mingw-w64-ucrt-x86_64-perl 5.32.1-4
        A highly capable, feature-rich programming language (mingw-w64)
    clang64/mingw-w64-clang-x86_64-clang 12.0.1-5 (mingw-w64-clang-x86_64-toolchain)
        C language family frontend for LLVM (mingw-w64)
    clang64/mingw-w64-clang-x86_64-libc++ 12.0.1-5 (mingw-w64-clang-x86_64-toolchain)
        C++ Standard Library (mingw-w64)
    clang64/mingw-w64-clang-x86_64-perl 5.32.1-4
        A highly capable, feature-rich programming language (mingw-w64)
    msys/gcc 10.2.0-1 (msys2-devel) [已安装]
        The GNU Compiler Collection - C and C++ frontends
    msys/gcc-fortran 10.2.0-1 (msys2-devel)
        Fortran front-end for GCC
    msys/gcc-libs 10.2.0-1 (msys2-devel) [已安装]
        Runtime libraries shipped by GCC
    msys/lcov 1.15-1
        front-end for GCC's coverage testing tool gcov
    msys/mingw-w64-cross-gcc 10.2.0-1 (mingw-w64-cross-toolchain mingw-w64-cross)
        Cross GCC for the MinGW-w64
    

    如何选择

    我的环境里是:cygwin和msys2都装了。想用哪个都随便,下面两个需求,cygwin和msys2都可以实现。

    • 想得到win上原生运行的程序,就安装带mingw的gcc,比如mingw64/mingw-w64-x86_64-gcc,不管msys2和cygwin都可以装。
    • 想得到linux兼容性比较高的程序就使用msys/gcc 10.2.0-1 (msys2-devel)这种,同样,不管msys2和cygwin都可以装。
    • 或者 https://winlibs.com/ 与mingw的工作重心在代码上不同,这个网站只做编译包,他会去mingw拿到最新的源码并编译出来gcc.exe然后发布出来,版本会比较全。

    cygwin的特点:可以手动选gcc版本,比较方便。但是安装其他软件只能重新启动cygwin的setup软件。另外cygwin更新好像略慢。
    msys2的特点:包管理工具pacman很好用,软件很多。但是想要特定版本的gcc只能用特定的msys2安装包。
    msys2在清华源(https://mirrors.tuna.tsinghua.edu.cn/msys2/)可以找到所有版本的安装包,也还比较方便。

    one more thing

    其实一开始mingw也是把自家的所有gcc打包发布的,但是这个setup包发布更新太慢这才出来了mingw-64。mingw-64同样因为类似的问题才出来了msys2。mingw-64已经很久没发布gcc的setup包了,都是cygwin或者msys2拿到mingw的代码编译一份出来。

  • 相关阅读:
    StrutsTestCase 试用手记
    java版的SHA1
    看看junit在一个具体的项目中
    store/index.js中引入并注册modules目录中的js文件:require.context
    vue项目报错:$ is not defined
    状态合并:replaceState
    路由导航守卫中document.title = to.meta.title的作用
    vue路由中meta的作用
    BCryptPasswordEncoder加密与MD5加密
    滑块验证机制
  • 原文地址:https://www.cnblogs.com/feipeng8848/p/15227688.html
Copyright © 2011-2022 走看看