【发布时间】: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