0

我使用 Microsoft Visual C++ Build Tools 2015在Windows 容器中构建 C++ 代码

msbuild /p:Configuration=Debug基本上cl.exe使用/MDd选项运行并产生无法使用的可执行文件 - 见下文。

/p:Configuration=Release使用/MD并制作完美的可执行文件。

示例代码hello-world.cxx

#include <iostream>
int main()
{
  std::cout << "Hello World!";
}

编译/MDd

> cl.exe /EHsc /MDd hello-world.cxx
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24210 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

hello-world.cxx
Microsoft (R) Incremental Linker Version 14.00.24210.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:hello-world.exe
hello-world.obj

> echo %ERRORLEVEL%
0
> hello-world.exe
   ...nothing is printed here...
> echo %ERRORLEVEL%
-1073741515

编译/MD

> cl.exe /EHsc /MD hello-world.cxx
...
> hello-world.exe
Hello World!
> echo %ERRORLEVEL%
0

这是我的 Dockerfile 的相关部分:

FROM microsoft/windowsservercore
...
# Install chocolatey ...
...
# Install Visual C++ Build Tools, as per: https://chocolatey.org/packages/vcbuildtools
RUN choco install -y vcbuildtools -ia "/InstallSelectableItems VisualCppBuildTools_ATLMFC_SDK"
# Add msbuild to PATH
RUN setx /M PATH "%PATH%;C:\Program Files (x86)\MSBuild\14.0\bin"
# Test msbuild can be accessed without path
RUN msbuild -version

如您所见,我通过 choco 包安装了 Visual C++ Build Tools 2015。

我已阅读文档:https ://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library

所以/MDd 定义 _DEBUGMSVCRTD.lib放入 .obj 文件中,而不是 MSVCRT.lib

在我的笔记本电脑上,我安装了完整的 Visual Studio,并且构建良好。

我比较MSVCRTD.lib了我C:\Program Files (x86)\Microsoft Visual Studio 14.0在两个系统下安装的文件是相同的。

使困惑...

4

1 回答 1

2

解决了

容器没有 GUI,编译后的 .exe 尝试显示带有以下消息的 GUI 对话框:

“程序无法启动,因为您的计算机中缺少ucrtbased.dll。请尝试重新安装程序以解决此问题。”

(在类似的环境中运行构建的 .exe 但使用 GUI 时发现此问题)

有趣的是,C++ Build Tools 2015 将这些 dll-s 安装在:

  • C:\Program 文件 (x86)\Windows 工具包\10\bin\x64\ucrt\
  • C:\Program 文件 (x86)\Windows 工具包\10\bin\x86\ucrt\

但是,当 .exe 运行时,它找不到它们。

在完整的 VS 安装中,我发现这些文件也复制到了

  • C:\Windows\System32\
  • C:\Windows\SysWOW64\

重新安装 C++ Build Tools 有帮助,但是速度很慢而且感觉很奇怪。所以我最终只是手动复制了这些文件。

添加到 Dockerfile:

RUN copy "C:\Program Files (x86)\Windows Kits\10\bin\x64\ucrt\ucrtbased.dll" C:\Windows\System32\
RUN copy "C:\Program Files (x86)\Windows Kits\10\bin\x86\ucrt\ucrtbased.dll" C:\Windows\SysWOW64\
于 2017-07-20T00:38:33.463 回答