出版日期:
我最近开始在Win10上开发(C++)。我有一个CMake项目,它构建得非常好(调试和发布构建),但是如果我试图以调试的目的运行它,我会得到VCRUNTIME140_1D.dll
缺失错误。
问题在于缺少VC++运行时140.1的调试版本(因此错误消息中出现了D
前缀)。
我以两种方式启动二进制:
- PowerShell -它会无声地崩溃(这是PowerShell中非常典型的不合作行为,我仍然需要时间来适应)
- VS 2017中的调试模式-用于实际调试。这是实际错误(以消息框的形式)出现在我的屏幕上的地方。
设定:
使用Visual Studio 2017,Win10。在开发阶段需要调试,但稍后将创建发布版本并交付给客户。
使用CMake 3.12(VS 2017附带)。在最后可以看到完整的CMakeLists.txt
。
我链接的库是
libtorch 1.12.1
-最新版本的libtorch C++二进制文件,带有依赖项(直接从PyTorch的官方网站下载)。目前无法识别编译器。opencv 4.6.0
-OpenCV二进制文件的最新版本(直接从OpenCV官方网站获得)。提供两个版本-VC 14和VC 15。使用VC 15时,假设它是指Visual Studio 2015附带的VC++,即MSVC工具包的v140/v140.1。
这两个依赖项在调试版本和发布版本中都有,但是我想(如果可能的话)链接到第三方库的发布版本,集中精力调试我自己的代码(libtorch的调试版本的大小太大了--对于CPU和CUDA,你都得到了惊人的12 GB!)。
创意:
我在我的C:\
上看,我能找到的只有
vcruntime140d.dll
vcruntime140.dll
vcruntime140_1.dll
我还读到/MD
与/MDd
作为标志发挥了重要作用。
我在网上遇到了几个帖子,提到我需要安装Visual Studio 2019。
问题:
这里有两个重要问题:
- 我需要安装哪些组件(VS 2019或其他)才能获得此DLL,拥有它是否足以在调试模式下运行?
- 我可以在VS 2017专业版项目中使用(仅用于调试)VS 2019社区版附带的VC++运行时吗?目前我只能访问VS 2017专业版。
我在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/"
)
2条答案
按热度按时间j8yoct9x1#
**TL;DR:**移至VS 2019或VS 2022。
最新一代 Microsoft Visual C/C++ Runtime 针对VS 2015 Update 3、VS 2017、VS 2019和VS 2022提供了binary compatibility。这意味着 * 较新 * 版本的DLL可以与使用此工具系列 * 较旧 * 版本构建的库和可执行文件配合使用。
对于零售版(即发行版),您有几个选项,如Microsoft Docs所示。您可以从此处获得最新的REDIST软件包:X64、X86和ARM64中的一个或多个。
调试版本的CRT二进制文件仅在Visual Studio中提供,但您可以使用VS 2019或VS 2022 Build Tools Edition来获取它们。您不能随应用程序再分发调试版本的CRT。
vcruntime140_1.dll
是在Visual Studio 2019 Update 2中添加的。它是为了支持新的x64 exception handler。请注意,如果您使用/d2FH4-
构建,则此要求将被删除,但我怀疑问题是您使用的是为VS 2019构建的静态C++库(带有VS 2017工具集/链接器)。根据 * 二进制兼容性 * 规则,这是不受支持的场景。VS 2017的所有版本截至2022年4月均为out of mainstream support。
是否可以使用VS Community Edition取决于您的情况,功能集与VS Professional相同,但需要满足license agreement的要求。
46qrfjad2#
安装VS2019解决了这个问题。我仍然在使用VS2017,但现在
vcruntime140_1d.dll
与其他版本一起被发现。最终产品当然不会附带任何调试版本依赖项,只会给客户一个发布版本。我将打开一个new question regarding licensing issues,当结合调试库与社区版与专业版项目的商业应用程序。
我不知道为什么微软决定为2015年推出的运行时做一个调试版本,在2019年的版本中提供,而在2017年的版本中没有。