gpt4 book ai didi

c++ - 已退出的 dockerized C++ Windows 控制台应用程序,代码为 3221225781

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:18 28 4
gpt4 key购买 nike

我写了一个非常简单的c++ hello world程序

#pragma once
#include <iostream>
#include <fstream>

int main()
{
std::cout << "Hello Docker world!\n";
return 0;
}

这是作为发布 x64 windows 控制台应用程序构建的,因此生成一个 exe

比我使用以下 dockerfile 对这个程序进行 dockerize

FROM microsoft/windowsservercore

ADD ./DockerHello.exe /DockerHello.exe

# Run exe when the container launches
CMD C:\DockerHello.exe

但是,当我使用 docker run 时,它不会显示任何内容,而当我使用 docker ps -a 时,我看到它已退出,代码为 3221225781

通过一些在线搜索,我了解到这显然意味着我缺少一些 dll 左右,但我不知道如何找出是哪个?

有人能帮帮我吗?或者告诉我如何获得在 docker 中运行的简单 C++ 控制台应用程序?

最佳答案

正如评论中所确认的那样,问题源于运行时库不存在于从 MSVC 编译的代码的 Docker 镜像中。

要解决这个问题,您可以:

  1. 使用 /MT 标志静态链接到运行时。
  2. 在 docker 镜像上安装正确的运行时。

静态链接

必须将 /MT 标志(或变体)传递给 msbuild,这可以通过 Visual Studio 完成,如下所示(来自 Microsoft 的 documentation ):

Open the project's Property Pages dialog box. For details, see How to: Open Project Property Pages. Expand the C/C++ folder. Select the Code Generation property page. Modify the Runtime Library property.

安装运行时

要安装正确的运行时,您必须在构建 docker 镜像时安装可再发行组件。

ADD $url /vc_redist.exe
RUN C:\vc_redist.exe /quiet /install

对于 Visual Studio,这些是正确的 URL(截止到今天,可以随意编辑更新):

其中 $url 是正确的 Visual Studio Redistributable 的路径(下面提供的链接):

Docker 镜像选择

正如 OP 在评论中指出的那样,microsoft/nanoserver 图像在使用静态运行时链接时就足够了,但是,如果使用共享运行时链接,您应该使用 microsoft/windowsservercore 图像,否则,可再发行组件的安装将失败。

关于c++ - 已退出的 dockerized C++ Windows 控制台应用程序,代码为 3221225781,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53431448/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com