安装 MSYS(2) 后如何简单地使用纯 Mingw GCC?

How can I simply use pure Mingw GCC after installing MSYS(2)?

所以我一直在网上阅读,但我仍然很困惑。我知道 Linux-on-Windows 世界中有不同的工具:Msys、Msys2、Cygwin、Mingw 和 Mingw-64。

以下是我所知道的,如有错误请指正:

  1. Mingw 的目标只是成为 Windows 的 GCC 程序的端口。它创建本机 Windows 二进制文件,仅此而已。

  2. Mingw-64 只是更新且支持更好的 Mingw 版本,它还支持 Windows 64 位。

  3. Cygwin,同时还包括 Mingw (?) 以在 Windows 上支持 GCC,通过默认链接所有程序的 DLL 提供 POSIX 兼容层。

  4. MSYS 是 Cygwin 的一个分支,但它放弃了一些 POSIX 兼容性工作。相反,它主要旨在允许创建本机 Windows 程序。但是 - 它们仍将依赖于存在的 MSYS DLL。

  5. MSYS2 只是不太活跃的 MSYS 的更新和活跃的版本。

这都是真的吗?如果是,这就是我要验证的内容:

基本上,我认为我的开发只需要 Mingw,以便使用 GCC 构建本机 Windows 应用程序。我不需要 POSIX 层,而且我 不希望 我的程序依赖于 Windows 系统上存在的 DLL 之外的任何 DLL反正。据我了解,这就是 Mingw 提供的。

但是,我设法在我的系统上安装了 MSYS(或 MSYS2?我不确定了)。我之前关注的教程建议这样做。

因为 MSYS(2) 似乎在 C:\msys64\mingw64 下包含 Mingw,我只是直接从 Windows CMD 使用 Mingw 二进制文件,而不通过 MSYS(2) shell 程序.例如,我只是将 C:\msys64\mingw64\bin 添加到 PATH 并且我从 Windows CMD 直接添加 运行 gcc 来编译我的项目。

  1. 这是使用 Mingw 的有效方法吗?还是我会 运行 遇到问题?

  2. 这种方法是否会创建纯 Windows 本机二进制文件,不应依赖于任何与 MSYS(2) 相关的 DLL?

  3. 只有当我通过 msys2.exe shell节目?因此,如果我想避免任何 MSYS(2) 或 Cygwin 相关的东西,而只是使用纯 Mingw GCC,是否可以如前所述直接在 Mingw 目录下启动 GCC?

更新: 我现在已经使用 Dependency Walker 检查过,并且来自 MSYS2 shell 的 运行ning C:\msys64\mingw64\bin\gcc 仍然创建了一个 .exe 没有特殊的依赖关系(这很好)。那么 MSYS2 文档所说的 msys-2.0.dll 是什么?使用 MSYS2 编译 C 与仅使用 Mingw 有何不同?

关于这些项目是什么,您基本上是正确的。 MSYS2 确实为 POSIX 程序(如 Bash、GNU Make 和其他实用程序)提供了一个环境,但它还提供了一个名为 pacman 的包管理器,您可以使用它来安装许多其他东西。其实你可以用pacman安装一个mingw-w64工具链。

MSYS2 实际上提供了两个 mingw-w64 工具链:您可以选择一个 i686(32 位)工具链,它使本机 Windows 二进制文件可以 运行 在任何 Windows 上计算机,或 x86_64(64 位)工具链,它使本机 Windows 二进制文件只能在 64 位 Windows 上运行。您可以同时安装这两个。

你说 "I don't need a POSIX layer",但你可能会发现在构建你的本地 Windows 软件。如果有一天你想在 Linux 或 macOS 上构建你的软件,这将特别有用:可以编写一个简单的 Makefile 或 shell 脚本,在这些平台和 MSYS2 上运行。

  1. 是的,如果您愿意,可以直接使用 C:\msys64\mingw64\bin 中的二进制文件。
  2. 是的,mingw-w64 工具链创建本机 Windows 二进制文件,无论您碰巧 shell 从哪个 运行 它。
  3. 没有。无论您是通过 msys2.exe、mingw32.exe 还是 mingw64.exe 启动 MSYS2,您都会得到一个 Bash shell 以及各种可用的 Linux 实用程序,例如 [=11] =]、grepmaketar。 shell 和那些实用程序使用 msys-2.0.dll 提供的 POSIX 仿真。这些 MSYS2 启动器之间的主要区别在于添加到您的 PATH 中的内容,因此您可能希望在每个环境中 运行 echo $PATHenv 并比较结果。

我强烈建议使用 MSYS2 而不是 MSYS 和 mingw.org 。假装后两者根本不存在。正在积极开发中,较新的项目在各个方面都更好。

MSYS2 的包管理器可以为以下目标系统提供工具链:

  • 独立 Win32 (i686)
  • 独立 Win64 (x86_64)
  • MSYS2 i686
  • MSYS2 x86_64

前两种情况可以从您喜欢的任何 shell 调用。如果不使用 MSYS2 提供的启动脚本,您可能需要设置路径。它们生成本机 Windows 可执行文件。使用默认切换到 GCC 会有一些依赖项,例如 libgcc_s*.dll 。使用 -static 进行静态构建将生成除 Windows DLL 之外没有任何依赖项的可执行文件。

在后两种情况下,二进制文件将依赖于 MSYS2 DLL 和其他东西,但这提供了对一系列 POSIX 功能的支持。

[~ MSYS]$ ls /usr/include
_ansi.h            cursesp.h      glob.h         net           strings.h
_newlib_version.h  cursesw.h      gnumake.h      netdb.h       symcat.h
_syslist.h         cursslk.h      grp.h          netinet       sys
a.out.h            cygwin         icmp.h         newlib.h      sysexits.h
acl                devctl.h       ieeefp.h       nl_types.h    syslog.h
aio.h              diagnostics.h  ifaddrs.h      panel.h       tar.h
alloca.h           dirent.h       inttypes.h     paths.h       term.h
alpm.h             dis-asm.h      io.h           plugin-api.h  term_entry.h
alpm_list.h        dlfcn.h        langinfo.h     poll.h        termcap.h
ansidecl.h         elf.h          lastlog.h      process.h     termio.h
ar.h               endian.h       libfdt.h       pthread.h     termios.h
argz.h             envlock.h      libfdt_env.h   pty.h         tgmath.h
arpa               envz.h         libgen.h       pwd.h         threads.h
asm                err.h          limits.h       reent.h       tic.h
assert.h           errno.h        locale.h       regdef.h      time.h
attr               error.h        machine        regex.h       tzfile.h
bfd.h              eti.h          magic.h        resolv.h      ucontext.h
bfd_stdint.h       etip.h         malloc.h       sched.h       unctrl.h
bfdlink.h          fastmath.h     mapi.h         search.h      unistd.h
bits               fcntl.h        math.h         semaphore.h   utime.h
byteswap.h         fdt.h          memory.h       setjmp.h      utmp.h
complex.h          features.h     menu.h         signal.h      utmpx.h
cpio.h             fenv.h         mntent.h       spawn.h       w32api
ctf.h              FlexLexer.h    monetary.h     ssp           wait.h
ctf-api.h          fnmatch.h      mqueue.h       stdatomic.h   wchar.h
ctype.h            form.h         nc_tparm.h     stdint.h      wctype.h
curses.h           fts.h          ncurses        stdio.h       winpty
cursesapp.h        ftw.h          ncurses.h      stdio_ext.h   wordexp.h
cursesf.h          gawkapi.h      ncurses_dll.h  stdlib.h      xlocale.h
cursesm.h          getopt.h       ncursesw       string.h
[~ MSYS]$
[~ MSYS]$
[~ MSYS]$ ls /usr/include/sys
_default_fcntl.h  acl.h          fcntl.h     mman.h    quota.h     signal.h      stdio.h      termio.h    ttychars.h  utsname.h
_intsup.h         cdefs.h        features.h  mount.h   random.h    signalfd.h    strace.h     termios.h   types.h     vfs.h
_pthreadtypes.h   config.h       file.h      msg.h     reent.h     smallprint.h  string.h     time.h      ucontext.h  wait.h
_sigset.h         custom_file.h  iconvnls.h  mtio.h    resource.h  socket.h      sysinfo.h    timeb.h     uio.h       xattr.h
_stdint.h         cygwin.h       ioctl.h     param.h   sched.h     soundcard.h   syslimits.h  timerfd.h   un.h
_timespec.h       dir.h          ipc.h       poll.h    select.h    stat.h        syslog.h     times.h     unistd.h
_timeval.h        dirent.h       kd.h        procfs.h  sem.h       statfs.h      sysmacros.h  timespec.h  utime.h
_types.h          errno.h        lock.h      queue.h   shm.h       statvfs.h     sysproto.h   tree.h      utmp.h

Cygwin 是一个竞争产品,也提供 POSIX 功能并依赖于 Cygwin DLL。 MSYS2 目标是 Cygwin 的一个分支。