前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >缺少运行时库的解决方案

缺少运行时库的解决方案

作者头像
程序员的园
发布2024-07-18 13:26:59
690
发布2024-07-18 13:26:59
举报
文章被收录于专栏:程序员的园——原创文章

背景

windows平台使用MSVC开发的程序,默认会依赖运行时库,因此将程序安装到纯净的电脑环境后,执行程序时会弹窗提示缺少库,如下图。

解决方案

为保证程序在新的电脑环境中正常运行,需要保证运行时库在程序内是自含有(self-contained)的。依据实现方式的不同可以分为假自含和真自含。

假自含

当纯净的电脑环境中没有相对应的运行时库时,将运行时库与程序一同提供即可,在纯净的电脑环境中,程序找到相对应的运行时库便可正常运行。

这种方法多应用于客户端软件,将软件依赖的运行时库打包到安装包内,安装可执行程序时将相对应的运行时库一同安装上,保证可执行程序能够找到相对应的运行时库,进而保证程序的正常运行。如下为某大型程序的所依赖的运行库。

真自含

运行时库的链接类型

打开MSVC项目的属性页,可以在代码生成中看到运行时库的四种不同依赖类型。项目右键->属性->配置属性->C/C++->代码生成->运行库

由上图可知,对于运行时库的依赖,MSVC提供了四种方式,分别是

  • 静态:(/MT):multithreead static version,表示使用多线程静态链接库。这意味着生成的可执行文件将包含所有程序所需的函数代码,无需依赖外部的 DLL 文件,但它会增加可执行文件的大小。
  • 静态debug:(/MTd):multithreead static version debug,类似于MT,但包含了额外的调试信息以支持调试过程。
  • 动态:(/MD):multithreead dynamic version, 表示使用多线程 DLL 运行库。这意味着程序将依赖于外部的 DLL 文件,减少了可执行文件的大小,但需要确保目标系统上存在相应的运行库。
  • 动态debug:(/MDd):multithreead dynamic version debug,类似于MD,但包含了额外的调试信息以支持调试过程。

而MD MDd作为MSVC的默认设置,这才使得程序或库需要依赖运行时库,为了保证程序或库是真正自含的,需要主动修改代码对于运行时库的依赖为MT或MTd。

如果是MSVC组织的工程,通过项目属性页修改代码生成中运行库的依赖为MT或MTd即可。

如果使用CMake组织工程,需要手动修改CMaleLists.txt,可参考如下的示例CMaleLists.txt文件

代码语言:javascript
复制
# !!!需要大于3.15版本,
cmake_minimum_required(VERSION 3.15)

# !!!需要设置辞属性
# !!!此属性的设置需要在project前
# !!!父类设置后所有subdirectory均生效
if (POLICY CMP0091)
  cmake_policy(SET CMP0091 NEW)
endif (POLICY CMP0091)

project(test_add CXX)

include_directories(./dll_source)

add_subdirectory(dll_source)

add_executable(${PROJECT_NAME} main.cpp
)

target_link_libraries(${PROJECT_NAME}
    add
)

# !!!设置MT/MTd
# !!!所有依赖的库需要设置相同的属性,需同为MT或同为MTd
set_property(TARGET ${PROJECT_NAME} PROPERTY   MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

总结

为了解决程序对于运行时库的依赖,提出了2类方法,一种是将相对应的运行库一同打包;一种是修改程序对于运行库是静态依赖,进而提出了两种修改静态依赖的方法,在MSVC工程中修改或修改CMakeLists.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档