【发布时间】: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.dllvcruntime140.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_1dDLL,这意味着PATH或不是PATH,这个问题将永远存在。对于我的软件的开发阶段和随之而来的调试,我希望只需要处理与 Win10 SDK、VC 运行时等无关的第 3 方依赖项。例如。在我的情况下,这些依赖项是 OpenCV 和 libtorch。
标签: c++ visual-studio cmake visual-studio-2017 visual-studio-2019