【问题标题】:VCRUNTIME140_1D.dll missing in Visual Studio 2017 CMake project - do I need Visual Studio 2019 too and use it in older version of Studio?Visual Studio 2017 CMake 项目中缺少 VCRUNTIME140_1D.dll - 我是否也需要 Visual Studio 2019 并在旧版本的 Studio 中使用它?
【发布时间】:2022-11-07 08:49:36
【问题描述】:

问题:

我最近开始在 Win10 上开发(C++)。我有一个构建完美的 CMake 项目(调试和发布构建),但是如果我尝试运行它以进行调试,我会收到 VCRUNTIME140_1D.dll 丢失错误。

问题在于缺少 VC++ 运行时 140.1 的调试版本(因此错误消息中的 D 前缀)。

我以两种方式启动二进制文件:

  • PowerShell - 静默崩溃(这是 PowerShell 中非常典型的不合作行为,我仍然需要时间来适应)
  • VS2017中的调试模式——用于实际调试。这是实际错误(以消息框的形式)出现在我的屏幕上的地方。

设置:

使用视觉工作室 2017,Win10。在开发阶段需要调试,但稍后将创建发布版本并将其交付给客户。

使用 CMake 3.12(随 VS2017 提供)。最后可以看到完整的CMakeLists.txt。

我链接的库是

  • libtorch 1.12.1 - 具有依赖项的最新版本的 libtorch C++ 二进制文件(直接来自 PyTorch 的官方网站)。目前无法识别编译器。
  • opencv 4.6.0 - 最新版本的 OpenCV 二进制文件(直接来自 OpenCV 官方网站)。提供两个版本 - VC14 和 VC15。使用 VC15,假设它指的是 Visual Studio 2015 附带的 VC++, 那是v140/v140.1MSVC 工具包。

这两个依赖项在调试和发布版本中都可用。但是,我想(如果可能)链接到第 3 方库的发布版本,并专注于调试我自己的代码(libtorch 的调试版本的大小是疯狂的——对于 CPU 和 CUDA,你会得到高达 12GB 的容量!)。

想法:

我看着我的C:\,我能找到的只有

  • vcruntime140d.dll
  • vcruntime140.dll
  • vcruntime140_1.dll

我还读到 /MD 与 /MDd 作为标志起着重要作用。

我在网上遇到了一些帖子,提到我需要安装 Visual Studio 2019。

问题:

以下两个问题在这里很重要:

  • 我需要安装哪些组件(VS2019 或其他)才能获得这个 DLL,是否足以让它能够在调试模式下运行?

  • 我可以在 VS2017 专业版项目中使用(仅用于调试)VS2019 社区版附带的 VC++ 运行时吗?目前我只能访问 VS2017 的专业版。


我在 CMake 中的项目文件如下所示:

CMakeLists.txt

cmake_minimum_required (VERSION 3.12 FATAL_ERROR)

project(pytroch
  DESCRIPTION "CMake example for PyTorch (libtorch C++) integration"
  LANGUAGES CXX
)

set(CMAKE_CXX_STANDARD 14)

set(INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
set(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")

set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/deps/libtorch/1.12.1/debug/cpu/share/cmake/Torch")
#set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/deps/libtorch/1.12.1/release/cpu/share/cmake/Torch")
find_package(Torch REQUIRED)
if(TORCH_FOUND)
    message(STATUS "Found Torch")
else()
    message(CRITICAL_ERROR "Unable to find Torch")
endif(TORCH_FOUND)

set(CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/deps/opencv/4.6.0/")
find_package(OpenCV 4.6.0 REQUIRED)

add_library(pytorch_cv_utils SHARED "${SRC_DIR}/pytorch_cv_utils.cpp")
target_include_directories(pytorch_cv_utils PUBLIC  ${INCLUDE_DIR} ${TORCH_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
target_link_libraries(pytorch_cv_utils PUBLIC ${TORCH_LIBRARIES} ${OpenCV_LIBS})

add_executable(pytroch_load_model
    "${SRC_DIR}/pytroch_load_model.cpp"
)
target_include_directories(pytorch_cv_utils PUBLIC  ${INCLUDE_DIR} ${TORCH_INCLUDE_DIRS})
target_link_libraries(pytroch_load_model PRIVATE pytorch_cv_utils)

# Copy Torch dependencies to binary folder
file(GLOB LIBTORCH_DLLS
#  "${CMAKE_SOURCE_DIR}/deps/libtorch/1.12.1/release/cpu/lib/*.dll"
  "${CMAKE_SOURCE_DIR}/deps/libtorch/1.12.1/debug/cpu/lib/*.dll"
)
file(COPY
    ${LIBTORCH_DLLS}
    DESTINATION "${CMAKE_BINARY_DIR}/bin/"
)

# Copy OpenCV dependencies to binary folder
file(GLOB OPENCV_DLLS
  "${CMAKE_SOURCE_DIR}/deps/opencv/4.6.0/x64/vc15/bin/*.dll"
)
file(COPY
    ${OPENCV_DLLS}
    DESTINATION "${CMAKE_BINARY_DIR}/bin/"
)

【问题讨论】:

  • 只是为了澄清一下,您正在尝试在您的开发计算机上运行(或调试)您自己的应用程序?那么您应该已经有了调试“运行时”,因为它应该是 Visual Studio 安装的一部分。
  • 是的,我想在自己的计算机上进行调试,然后发布发布版本。据我所知,无论如何都无法将 VC++ Runtime 的调试版本发送给最终用户。
  • 也许问题是您需要设置(非VS)环境来设置PATH等?如果从命令行运行,通常在开始菜单中有一个特殊条目来启动具有正确环境集的命令行环境。 IIRC 还有一个 BAT 文件,也可以调用它来设置环境。如果您从 Visual Studio 内部运行,则应该已经为您设置了该环境。当您从 VS 内部运行时,它是否有效?
  • 在 VS2017 本身中以调试模式运行二进制文件时出现此错误。在 PowerShell 中,Windows 甚至懒得告诉我任何事情,只是默默地崩溃(我真的不得不习惯来自 Linux 终端的东西)。
  • 我也无法在任何地方找到vcruntime140_1d DLL,这意味着PATH 或不是PATH,这个问题将永远存在。对于我的软件的开发阶段和随之而来的调试,我希望只需要处理与 Win10 SDK、VC 运行时等无关的第 3 方依赖项。例如。在我的情况下,这些依赖项是 OpenCV 和 libtorch。

标签: c++ visual-studio cmake visual-studio-2017 visual-studio-2019


【解决方案1】:

当前一代Microsoft Visual C/C++ 运行时对于 VS 2015 Update 3、VS 2017、VS 2019 和 VS 2022,具有 binary compatibility。这意味着较新DLL 的版本适用于使用构建的库和可执行文件年长的这个工具系列的版本。

对于零售分发(即仅发布版本),您有一些选项,如 Microsoft Docs 所述。您可以从这里获取最新的 REDIST 包:X64、X86 和 ARM64。

CRT 二进制文件的 DEBUG 版本仅适用于 Visual Studio,但您可以使用 VS 2019 或 VS 2022 Build Tools Edition 获取它们。您不能将 CRT 的调试版本与您的应用程序一起重新分发。

vcruntime140_1.dll 是在 Visual Studio 2019 Update 2 中添加的。它支持新的 x64 exception handler。请注意,如果您使用/d2FH4- 构建,则此要求将被删除,但我怀疑问题在于您是使用 VS 2017 工具集为 VS 2019 构建的静态库。这不是每个受支持的方案二进制兼容性规则。

能否使用 VS 社区版取决于你的情况。功能集与 VS Professional 相同,但您需要满足license agreement 的要求。

【讨论】:

    【解决方案2】:

    安装 VS2019 解决了这个问题。我仍在使用 VS2017,但现在 vcruntime140_1d.dll 与其余部分一起找到。最终产品当然不会附带任何调试版本依赖项,只会向客户提供发布版本。

    在将社区版附带的调试库与用于商业应用的专业版项目相结合时,我将打开一个new question regarding licensing issues。

    我不确定为什么 Microsoft 决定为 2015 年推出的东西制作运行时的调试版本,而 2019 年版中可用,但 2017 年版中没有。

    【讨论】:

    • 我知道我无法发布调试版本(如我在上面的评论和我的问题中所述)。至于将调试与发布版本混合 - 是的,我知道存在差异,但在很多情况下这些差异可以忽略不计(当然有很多,但不能忽略)。如果您愿意,我已经发布了一个关于我在这里面临的许可困境的问题。 :D
    • 您可能偶然收到vcruntime140_1d.dll,而不是故意的。 Microsoft 的工具本身也是使用 Visual Studio 构建的,并且由于明显的先有鸡还是先有蛋的问题,新 Visual Studio 版本的某些部分必须使用旧版本进行编译。
    • @MSalters 巧合是什么意思?虽然这可能只是 MS 方面的草率工作,但安装 VS2019 确实提供了所需的库,而 VS2017 没有。为此,我不会称其为巧合。
    • 此外,vscruntime140 可以在 Microsoft download site 上找到。请考虑接受它作为答案以将其状态更改为已回答。见can I answer my own question..,只是一个提醒:)
    猜你喜欢
    • 2019-02-01
    • 2017-08-07
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多