一个C ++ Hello World和一杯红酒,噢,我的天哪!

这是C ++中正确的“ Hello World ”。 所有其他你好世界 错了 但这不是我如何using namespace std; 使与C ++教学混为一谈的一切变得清晰。 也许是另一个时间。

今天我们要编译 你好世界 使其可以在目标系统上执行

但首先,让我告诉您一些有关我的事情。 我使用Linux来获得乐趣和收益。 我碰巧认为这是最好的系统。 为了我。 作为开发人员。 有时,我看不起使用Windows的开发人员,想知道他们如何通过单击来完成任何事情。 而且,Arch上的vim用户很可能因为使用Ubuntu而鄙视我。 没有人是完美的。

无论如何,让我们启动一个终端

# sudo apt-get install g++
# g++ -o helloworld helloworld.cpp
# ./helloworld
Hello, World!
#

很好,很简单,我们回家喝啤酒吧!

但是,然后进入我的老板。 他们从事向使用Windows的人出售软件的业务。 我试图向他们展示我可以说些牛话并且可以调整终端的大小,因此我们显然应该立即将所有业务转移到Linux,他们说出一些关于市场份额的理解,显然,他们也可以调整命令提示符的大小。

在像被困在一张Escher画中一样互相看了一会儿之后,我勉强地记得我正在努力使我的客户满意,因此我们要将hello world应用程序移植到Windows。 我们的老板不在乎我们用来创建该突破性应用程序的环境,而且我在同一时间继续开发Linux版本也没有问题,因此我决定为Windows开发该应用程序, Linux上; 可能出什么问题了?

此外,建立构建服务器场和持续集成将变得容易得多。 您甚至可以即时配置CI提供新鲜的docker容器,以在可控的新鲜环境中构建Windows应用程序。 虽然我倾向于认为Dockers有点不受欢迎,但与Jenkins一起使用Docker实际上是很有意义的。 并且,如果您喜欢sysadmin,请不要强迫他们处理Windows服务器。

我们应努力使您的应用程序尽可能地可移植且不受平台限制,因此拥有Windows版本的应用程序实际上可能会使我们的代码更好。 这就是我要告诉自己的。

事实证明,Microsoft足以为Windows提供一个名为msvc的编译器,并且我认为msvc是Windows上比g++更好的选择,因为这是围绕整个生态系统设计的编译器。 希望微软最了解自己的工具,格式和调用约定。 我从来没有花更多的精力来进行基准测试,您会在互联网上找到这两种方法的支持者。 但是, MSVC团队同意我的观点。 令人震惊

无论如何,现在,让我们坚持下去。

# apt-get install msvc
E: Unable to locate package msvc

令人惊讶的是,这行不通。 你不能责怪一个人尝试。 但是为了解释原因,让我告诉您编译器是如何工作的。

编译器打开一个文件,将该文件的内容转换为可以执行的内容,并将其写到其他文件中。 有时您有多个源文件,因此需要一个链接程序,该程序是一个打开一堆文件并写下可执行文件的程序。 可执行文件是一个文件,对此没有什么不可思议的。 有时您需要库。 库是一个文件。 而且您很可能需要大量的标头,这些标头是……文件。 普通的旧文件。 然后,该可执行文件由另一个也是文件的可执行文件加载,从头到尾都是文件。 好的,也许没有,计划9有更多文件。

需要明确的是,编译器是极其复杂的工程,尤其是C ++编译器,您应该向遇到的所有编译器编写者提供cookie。 但是,从系统集成的角度来看,它们是微不足道的。 大多数编译器甚至不理会线程。 他们让构建系统处理该问题。 不幸的是,由于大多数构建系统尚未学习如何系鞋带。

无论如何……这是编写编译器所需的内核工具列表:

  • 打开,读取和写入文件
  • 读取目录内容
  • 分配内存

因此,您可能会认为这是一个足够合理的列表,因此,您想知道为什么msvc在Linux上不可用。 当然,拥有msvc来构建Linux / ELF应用程序将是一项艰巨的任务,并且可能没有意义,但是我们所要做的就是 Windows构建应用程序,当然Microsoft会让我轻松实现这一点,对吗?

但是有这个东西。 Windows是一个“生态系统” 。 这意味着他们希望将其操作系统出售给用户和开发人员,将其工具出售给开发人员,并确保没有人了解其他操作系统传奇。 因此,如果要构建Windows应用程序,则需要Windows。 废话

幸运的是,有人在Linux上重写了Windows,并将其命名为Wine。 可能是因为他们必须非常醉才能考虑这样做。 葡萄酒仅用了15年的时间就达到了1.0 。 但是现在是3.0 ,也许我们可以使用它吗? 开源社区中有一些小奇迹,WINE当然是其中之一。

很长时间以来,MSVC与Visual Studio捆绑在一起。 这意味着,如果您想使用Qt Creator,CLion,Eclipse或notepad ++在Windows上编译C ++应用程序,则仍然必须拥有Visual Studio。 生态系统等等。

现在情况变好了,您可以安装“构建工具”,这样您只需安装大约5GB的东西。 来做吧。

哦,显然,编译器作为可执行文件分发,然后可以通过互联网下载您不需要的内容。 也许比40GB的zip更好?

# wine vs_BuildTools.exe 
The entry point method could not be loaded

你惊喜吗? 我的梦想粉碎了。 我们确实需要一个Windows来进行一些Windows开发(扰流器:它会变得更好)。

让我们启动一个虚拟机。 如果要遵循,建议您使用新的或克隆的Windows 10 VM。 我们将要安装很多奇怪的东西,而我们自己清理起来几乎是不可能的。 之后,您可能会放弃VM

他不可爱吗? 也许我应该将简历发送给Oracle。

完成后,我们可以下载VS构建工具。

向下滚动直到获得腕管。 构建工具是倒数第二项。 下载。

我在启动安装程序时遇到了一些问题。 我认为他们尝试联系一台设法将自己添加到广告服务器列表中的服务器,因此我的DNS阻止了它。 不要问

那花了超过一分钟的时间。

安装程序带有加载屏幕,这是完全正常的。 完成后,它会缓慢而痛苦地加载主UI,但是接下来我们要选中复选框。 我正在爆炸。

购物清单。

您将不需要静态分析工具,但是无论安装哪种方式,在安装编译器时都会对其进行检查。 没关系。

我们需要一个C ++工具集-其他人都称为工具链的东西。 我不确定v14115.4 v14.11是什么。 使用模具?

我们也需要一个C运行时,这很方便。 我不确定是否需要CRTURT因此,我们将同时安装两者。 URT / CRT很好。 在它诞生之前,一切都变得非常艰巨。

最后,我们可能需要使用一些Windows功能,因此我们应该获得Windows SDK。 显然,这取决于某些C#组件。 显然 ,还有一些JS库 需要明确的是,如果没有Windows SDK,您将无法做任何远程有用的事情,最好立即获取。

WIN32_LEAN_AND_MEAN

在Visual Studio进入硬盘驱动器的每个凹进处时,时间要喝咖啡。 不过在某个时候,它已经完成了,因此您可以和蝴蝶一起骑自行车了。 真好

微软提供的漂亮图片改善了我的社论。

蝴蝶还不足以让我想要放弃Linux,所以让我们看看是否可以在没有Windows盒子的情况下使用我们刚刚安装的软件。

将以下内容复制到您的VM外部:

  • C:\Program Files (x86)\Windows Kits\10\Include
  • C:\Program Files (x86)\Windows Kits\10\Lib
  • C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC

前两个路径是Windows SDK,最后一个路径是工具链,其中包含所有体系结构的编译器,链接器,STL和VC运行时库。

在我的安装中,我到处都有URT文件,因此,我想如果您安装Windows 10 SDK,您实际上会获得CRT,因此在选择要安装的组件时不需要单独激活它。 与仅仅几年前相比,情况要好得多。 微软一直很忙。

复制所有东西!

我将所有内容都放在一个名为Windows的文件夹中,将msvc编译器与运行时,STL和可再发行组件放在一侧,并将Windows 10 SDK放在单独的文件夹中。 我没有保留有关所使用的SDK或工具链版本的任何信息,您可能想更正确地进行操作。

在Windows Sdk中,有一些有用的二进制文件和dll,例如rc.exe将它们放在工具链二进制文件所在的msvc2017/bin/Hostx64/x64中,包括cl.exe.

如果您不熟悉Windows开发:

  • cl.exe是编译器
  • link.exe是链接器
  • rc.exe是用于处理资源文件(包括图标和清单)的工具

如果必须处理驱动程序,cab文件,MSI安装程序等,则可能需要各种其他工具。

整个内容约为2.9GB 。 大约一半是我们必须在Windows VM上安装的。

到目前为止的路

再来点酒吧。 访问https://wiki.winehq.org/Ubuntuhttps://github.com/Winetricks/winetricks以确保您的葡萄酒设置是最新的。 我将使用wine-3.0

然后,安装VC 2017的可重新分发。该过程通常是自动的。 我们将使用专用的酒前缀来保留所有犹太洁食。 这意味着在Windows上的wine下进行多个msvc安装实际上更容易。

WINEPREFIX=windows/vs-buildtools2017-wine64 WINEARCH=win64 winetricks vcrun2017

然后在Windows文件夹中,创建一个bin64文件夹,您可以在其中编写一个包含以下内容的小型bash脚本。

该脚本将首先设置wine以使用我们的prefix。 然后,在将参数转发到wine上运行的实际Windows PE二进制文件之前,我们执行Linux-> Windows路径分隔符转换( /\ )。

我们将使用称为shc的工具将该包装程序转换为适当的elf可执行文件。 否则,我们可能会遇到问题。 另一种解决方案是编写一个C ++包装而不是bash。 从需要硬编码的安装路径开始, shc有一些缺点。

shc -f cl-wine.sh -o cl.exe
shc -f cl-wine.sh -o link.exe

您可以用相同的方式创建bin32文件夹,只需将最后一行更改为wine“ $ DIR” /../ msvc2017 / bin / Hostx64 / x86 / $ PROGRAM

具有x86目标编译器。 我不确定为什么您需要两组独立的二进制文件来支持另一种体系结构,但是我们这样做。 最后,x86链接器可能会抱怨缺少库,因此我们将创建一些符号链接。

cd windows/msvc2017/bin/Hostx64/x86/
for x in $(ls ../x64/ms*.dll); do ln -s $x .; done
我们要去的地方!

我们要做认真的工作之前的最后一件事。 我们需要删除vctip.exe因为它不起作用。 这是一个遥测工具,因此我们不需要它。 它位于windows/msvc2017/bin/Hostx*/** 。 如果您不遵循该步骤,则会遇到奇怪的堆栈跟踪。

是时候构建我们​​的Hello World应用程序了! 其实很简单

我们正在构建一个依赖于编译器标头(包括STL),C运行时以及某些Windows库(例如kernel32.lib)的可执行文件。

🍻

为了完整起见,这里是x86构建

事实是,整个工作相当简单,也许比使用适当的Windows还要简单。 不会对vcvarsall.bat和您喜欢的所有工具(如perl, git, python, sed, the terminal, zsh…等) vcvarsall.bat

🔨搭建系统

我们在Linux上运行了cl.exe ,是的! 在继续之前,我们应该将该外来工具链添加到一个不错的现代构建系统中。 由于我不打算处理cmake的热点,因此我们将使用我最喜欢的构建系统QBS

设置qb以使用我们的wine / msvc编译器应该很容易。

QBS可以自动检测工具链,但是存在一些问题。 首先,该工具假定MSVC仅存在于Windows上,因此禁用了某些代码路径。 我认为可以在几个小时内解决此问题,仅需要以可移植的方式实现CommandLineToArgv函数。

但是,对于工具太聪明了,有话要说。 QBS尝试在假定的位置解析vcvars.bat 。 那是我们很高兴地删除的一个文件。

现实检查,我们不会获得任何自动检测。 我们真的不需要。 我们可以手动设置工具链,并将其与msvc-on-windows-proper分开对待。 检测并不是真正的问题,因为我们只有几个包含目录和库路径。

我已经开始将一些文件推送到GitHub,这是一项正在进行的工作。 目前,调试版本已完全中断。 这个模块可以使我们对葡萄酒工具链有所了解。 它主要禁用所有探测,并假定一切都已正确配置。

因此,我们必须完成所有手动设置配置文件的工作。 但是,如果我们的努力证明了一切,那就是即使是像VC ++这样冗长的工具链也可以简化为少数几个变量(编译器,链接器,工具路径,包含,定义,库路径)。 因此,这里是我的QBS配置文件配置

最后,我们可以编写一个小的qbs构建脚本

然后我们就可以运行了, Voilà!

Bonsoir艾略特。

runner.sh是一个小的脚本 ,用于在启动新构建的Windows可执行文件之前设置wine前缀。 没什么好看的。

所以在这里。 Microsoft编译器,封装在bash脚本中,编译为ELF,由Linux上运行的现代构建系统驱动,构建64位PE可执行文件。 真是令人满足。

我们假想的老板正在敲门。 第二部分见。

From: https://hackernoon.com/a-c-hello-world-and-a-glass-of-wine-oh-my-263434c0b8ad

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值