如何使用 gcc4 构建依赖于 MSYS 的程序?

Posted

技术标签:

【中文标题】如何使用 gcc4 构建依赖于 MSYS 的程序?【英文标题】:How to build MSYS-dependent program with gcc4? 【发布时间】:2015-08-07 19:26:19 【问题描述】:

MinGW 带有一个为制作 Windows 程序而配置的 gcc。例如,它不会编译和链接这个小程序:

#include <unistd.h>

int main(void)

   uid_t u = getuid(); // no such function in Microsoft library
   return 0;

此程序编译并与 MSYS 编译器链接,因为 MSYS 库具有此功能。这就是例如 GNU Coreutils 程序 id 如何获取并打印用户 ID,以及 MinGW 中的 ls -l 如何打印用户和组 ID 等等。

唯一的问题是,这个 MSYS 编译器是旧的:gcc 3.4.4。

是否有一种很好的“规范”方式将 MinGW 的 gcc 4.5.2 指向正确的头文件和库以编译基于 MSYS 的程序?

或者根本不推荐这条路线;最好从头构建一个 MSYS gcc4,用 MSYS gcc3 引导?

【问题讨论】:

你看到我的回答了吗?对你有帮助吗? 【参考方案1】:

恐怕答案是“您可能不想这样做”(因此有关它的信息很少)。 MSYS 环境的目的是提供用于构建 MinGW 程序的实用程序。如果此目的不需要给定程序,则不需要为 MSYS 构建它。

也就是说,MinGW 有效地提供了一个交叉编译工具链,其中目标系统是基于微软库的 Windows 上的可执行环境。交叉编译工具链本身的实用程序是基于 MSYS 构建的,但 MSYS 不适用于交叉编译的程序。

需要更多类 Unix 环境的应用程序(如 MinGW 中包含的实用程序所享受的环境)可以使用 Cygwin。无论如何,MSYS 是 Cygwin 的一个分支。与 Cygwin 一样,MSYS 提供了自己的库。例如,不仅有getuid,而且如果你在一个文件上调用statst_uidst_gid 字段是根据文件安全描述符中的信息填充的,而微软版本的函数使用MinGW 程序会将这些字段保留为零。 MSYS 必须被视为与 MinGW 不同的目标,如 Cygwin;将适用于 MinGW 的程序转换为 MSYS 是一种移植形式。

在我的例子中,有问题的程序已经以 Cygwin 为目标,因此支持 MSYS 作为目标可能没有什么意义,除非 MSYS 项目想要将该程序作为 MinGW 环境的一部分。

【讨论】:

以上是关于如何使用 gcc4 构建依赖于 MSYS 的程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何运行与 MSYS 中的 DLL 链接的程序?

为啥 MinGW/MSys 会更改二进制路径?

如何安装 MinGW-w64 和 MSYS2?

如何在 MSYS2 中通过 CMake 构建 c++ Qt5 应用程序

如何使用 make 命令(MSYS)来构建 DCMTK?

调试使用 mingw/msys2 构建的 Windows 服务