0

我建立內部的Windows容器 C++代碼使用Microsoft Visual C++生成工具2015年微軟的Visual C++與/ MDD產生的Windows容器內破可執行

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 

正如你可以看到我安裝Visual C++編譯通過巧克力包裝工具2015年。

我讀過的文檔:https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library

所以/MDd定義_DEBUG也放置MSVCRTD.lib成obj文件,沒有MSVCRT.lib

在我的筆記本電腦,我已經安裝了完整的Visual Studio和它建立的罰款。

我比較了MSVCRTD.lib,我已經安裝在C:\Program Files (x86)\Microsoft Visual Studio 14.0下,並且在兩個系統上的文件都是一樣的。

困惑......

回答

1

解決

容器沒有GUI,並編譯的.exe試圖展示GUI對話框,顯示消息:

「程序無法啓動,因爲您的 計算機中缺少ucrtbased.dll,請嘗試重新安裝程序來解決此問題。「

(在建立時運行時發現。在類似的環境,但與GUI的exe)

有趣的是C++生成工具2015年安裝在這些DLL-S:

  • C:\ Program Files文件(x86)的\的Windows套件\ 10 \ BIN \ 64 \ ucrt \
  • C:\ Program Files文件(x86)的\的Windows套件\ 10 \ BIN \ 86 \ ucrt \

然而.exe文件運行時,它無法找到他們。

在充分VS安裝,我發現這些文件還下

  • Ç複製:\ WINDOWS \ SYSTEM32 \
  • C:\ WINDOWS \ Syswow64資料\

的C重裝++構建工具幫助,但它很慢,感覺很奇怪。 所以我最終只是手動複製這些文件。

加入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\ 
相關問題