安装 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。
以下是我所知道的,如有错误请指正:
Mingw 的目标只是成为 Windows 的 GCC 程序的端口。它创建本机 Windows 二进制文件,仅此而已。
Mingw-64 只是更新且支持更好的 Mingw 版本,它还支持 Windows 64 位。
Cygwin,同时还包括 Mingw (?) 以在 Windows 上支持 GCC,通过默认链接所有程序的 DLL 提供 POSIX 兼容层。
MSYS 是 Cygwin 的一个分支,但它放弃了一些 POSIX 兼容性工作。相反,它主要旨在允许创建本机 Windows 程序。但是 - 它们仍将依赖于存在的 MSYS DLL。
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
来编译我的项目。
这是使用 Mingw 的有效方法吗?还是我会 运行 遇到问题?
这种方法是否会创建纯 Windows 本机二进制文件,不应依赖于任何与 MSYS(2) 相关的 DLL?
只有当我通过 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 上运行。
- 是的,如果您愿意,可以直接使用
C:\msys64\mingw64\bin
中的二进制文件。
- 是的,mingw-w64 工具链创建本机 Windows 二进制文件,无论您碰巧 shell 从哪个 运行 它。
- 没有。无论您是通过 msys2.exe、mingw32.exe 还是 mingw64.exe 启动 MSYS2,您都会得到一个 Bash shell 以及各种可用的 Linux 实用程序,例如 [=11] =]、
grep
、make
和 tar
。 shell 和那些实用程序使用 msys-2.0.dll 提供的 POSIX 仿真。这些 MSYS2 启动器之间的主要区别在于添加到您的 PATH 中的内容,因此您可能希望在每个环境中 运行 echo $PATH
和 env
并比较结果。
我强烈建议使用 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 的一个分支。
所以我一直在网上阅读,但我仍然很困惑。我知道 Linux-on-Windows 世界中有不同的工具:Msys、Msys2、Cygwin、Mingw 和 Mingw-64。
以下是我所知道的,如有错误请指正:
Mingw 的目标只是成为 Windows 的 GCC 程序的端口。它创建本机 Windows 二进制文件,仅此而已。
Mingw-64 只是更新且支持更好的 Mingw 版本,它还支持 Windows 64 位。
Cygwin,同时还包括 Mingw (?) 以在 Windows 上支持 GCC,通过默认链接所有程序的 DLL 提供 POSIX 兼容层。
MSYS 是 Cygwin 的一个分支,但它放弃了一些 POSIX 兼容性工作。相反,它主要旨在允许创建本机 Windows 程序。但是 - 它们仍将依赖于存在的 MSYS DLL。
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
来编译我的项目。
这是使用 Mingw 的有效方法吗?还是我会 运行 遇到问题?
这种方法是否会创建纯 Windows 本机二进制文件,不应依赖于任何与 MSYS(2) 相关的 DLL?
只有当我通过 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 上运行。
- 是的,如果您愿意,可以直接使用
C:\msys64\mingw64\bin
中的二进制文件。 - 是的,mingw-w64 工具链创建本机 Windows 二进制文件,无论您碰巧 shell 从哪个 运行 它。
- 没有。无论您是通过 msys2.exe、mingw32.exe 还是 mingw64.exe 启动 MSYS2,您都会得到一个 Bash shell 以及各种可用的 Linux 实用程序,例如 [=11] =]、
grep
、make
和tar
。 shell 和那些实用程序使用 msys-2.0.dll 提供的 POSIX 仿真。这些 MSYS2 启动器之间的主要区别在于添加到您的 PATH 中的内容,因此您可能希望在每个环境中 运行echo $PATH
和env
并比较结果。
我强烈建议使用 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 的一个分支。