【问题标题】:Is MSVC strictly necessary to compile on windows?MSVC 是否必须在 Windows 上编译?
【发布时间】:2024-05-21 05:10:02
【问题描述】:

一些开源项目明确指出,为了在 Windows 上编译,它们需要一个 microsoft 编译器(通常也是特定版本,因为后面的版本不兼容或拒绝编译旧代码)。

因为在我看来很荒谬,因为有 foss 编译器可以为 windows 编译,微软编译器对于 任何 基本任务都是必要的,我假设这是因为这些项目使用 api 调用库(例如 msvcrt*.dll),由于某种原因,mingw-gcc、clang 和其他 windows 编译器端口无法编译。

我对这些要求的理解很浅,因为我对编译代码的经验主要来自 linux,这让我很担心,因为获得一个 microsoft 编译器并非易事。获得它们的唯一方法是通过 microsoft's visual c++ 的 express editions,即使那样,最新版本也将完全拒绝安装在像我这样的旧 winxp 机器上,目前唯一可用的版本是 vc++express2010,这需要注册才能从试用软件变成免费软件(即使这样我也不清楚这是否可行或它需要什么——也许操作系统挂钩到“调试”和其他相互引用?)。

1) 我的问题是,这些项目是否依赖于微软编译器,因为它们是针对这些仅限微软的库进行构建的(这显然是 foss 编译器无法做到的)?

如果原因是构建脚本或预处理器指令,这似乎很荒谬,因为它们可以相对容易地移植。

2) 另外,是否有可能,即使我避免使用任何 msvcrt/.net/etc。调用,我仍然可以发现自己需要一个微软编译器来编译本机 Windows 软件(假设不使用执行这些调用的库)?

3) 我可以简单地使用 clang 和一些小部件库来制作原生 Windows 软件吗?

4) 我可以修改项目的源代码使其不依赖于微软编译器吗?

(好吧,这是4个问题,对不起,这对我来说很难表达清楚)。

【问题讨论】:

  • 您指的是哪些项目? Clang(即 LLVM)还没有可用的链接器(AFAIK),所以要么你自己做链接,要么现在你坚持使用 MSVC 的链接器
  • 大多数 UNIX/Linux 编译器生成相同格式的目标代码。同样,库的格式(静态和动态)也相当标准化。 Windows 编译器,包括来自 Intel 和 Borland/Embarcadero 的编译器,以不同的格式生成目标代码(有一次我相信 COFF 是一个选项,但它不是默认的)。库文件格式更加不同。因此编译器/链接器开关的集合是不同的。
  • @IvyLynx 这就是我的观点......但它不一定是一个选择。如果仅以 PC/DOS/Windows 格式提供库,则您无法选择使用例如明威同样,如果库仅以 .a 或 .so 格式提供,我不相信您可以将其与 MS 编译器一起使用。
  • @IvyLynx 另外我不相信 MS 工具集包含“make”实用程序。 (Borland C++ 做到了,并包含一个生成 makefile 的选项,但“本机”项目文件格式是专有的。)
  • 没有一个原因;每个项目都是不同的。也就是说,根据我的经验,最常见的原因(在 foss 项目的情况下)仅仅是 Windows 支持对开发人员来说是低优先级,他们只是懒得支持多个 Windows 编译器。 (在许多情况下,如果您愿意,添加对另一个编译器的支持并不是特别困难。)

标签: c++ c windows compiler-construction cross-compiling


【解决方案1】:

1) 我的问题是,这些项目是否依赖于微软编译器? 针对这些仅限微软的库进行构建(显然 foss 编译器做不到)?

编译器供应商和 GUI 框架供应商可以提供执行类似于 MS DLL 的 DLL。一些 MS DLL 是 system DLL,并被其他编译器和框架供应商使用。

如果您使用的是编译器或框架特定的 DLL,它们需要伴随您的程序(项目)的安装。

2) 另外,是否有可能,即使我避免使用任何 msvcrt/.net/etc。 调用,我仍然可以发现自己需要一个微软编译器来编译 本机 windows 软件(假设不使用库 执行那些调用)?

没有。如果你浏览 * 上的帖子,有很多人直接使用 Windows API,我猜你在调用什么 native windows 软件。通常,这些 API 的代码位于系统 API 中。编译器将函数调用转换为对这些 DLL 的调用,并根据需要加载它们。

3) 我可以简单地使用 clang 和一些小部件库来制作原生 windows软件也一样?

不,你不能。这就是它们存在的原因。 同样,许多人在没有 MS 编译器的情况下使用 Qt 和 xWidgets 等框架。我这样做了一段时间。我切换到 Visual Studio,主要用于调试器。我不喜欢其他 IDE 如何尝试使用 GDB。否则,我不会使用 MS,因为它们倾向于使用 Microsoft 标准语言而不是 ISO。

4) 我可以修改项目的源代码,使其不依赖于 微软编译器?

不,这就是为什么有免费软件和其他编译器的原因。
嗯,可以使用 Java 创建不使用 MS 编译器但使用 Windows API 的 GUI。

尝试安装 Cygwin。当您查看所有库时,您会意识到可以创建不使用 MS 编译器的项目。同样,通读 * 帖子,您会发现人们正在使用其他编译器,例如 Intel、GNU、Clang、Greenhills 等。一些嵌入式系统的编译器也可以为 Windows 操作系统编译,所以你可以编写在两个平台上都可以工作的代码。

看起来您需要在网上搜索“GNU GUI tutorial C++”并查看弹出的内容。另外,为其他框架搜索“wxWidgets”和“Qt”。

【讨论】:

  • 谢谢,这个答案涵盖了我无法清楚理解的大部分内容。但是,我认为我的问题比我最初认为的更令人费解:P 我不太关心我是否使用本机 Windows 调用,而是更多关于是否有可能没有 msvc 就无法做某事 - 其中,从您的回答看来,似乎没有这样的问题。我知道 cygwin/mingw 和小部件框架以及它们如何在源代码级别绑定 - 如果它们不明确需要 msvc,我可以使用其中任何一个。