VC++程序脱机运行DLL库缺失问题总结

当VC++程序在未安装VS环境的电脑上运行时,可能会出现DLL库缺失的问题。这通常由于缺少MFC和C++运行时库导致。解决方案包括静态链接CRT库、安装相应版本的VCRedist或调整工程配置。对于VS2015,Universal CRT的变化需要通过Windows Update或VCRedist安装更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        常用VS开发软件的同学们经常会遇到“程序在本机运行正常,拷贝到其他电脑上运行会报***.DLL缺失”的问题,本人也是深受该问题折磨,在此对该类问题做一个总结。为了方便问题的描述,我将开发程序的电脑称为“developer",运行程序的电脑称为”runner“。

一、追根索源

        表面上看,此类问题一般由两种原因引起:一是runner没有安装VS开发环境;二是runner的VS版本与developer不一致。具体细究起来,又可以发现,一般缺这么几个库(分为release和debug:

1,release版

mfc100.dll        msvcp100.dll        msvcr100.dll        

2,debug版

mfc100d.dll        msvcp100d.dll        msvcr100d.dll 


注:以上仅以vs2010为例,如果是vs2012或vs2013,则其中的数字分别为110和120。而vs2015不遵循这个规则,它引入了Universal CRT(C-Runtime),后面专门说。


        其中,mfc100.dll是MFC工程相关的库,另外两个是Mircrosoft Visual C++ Runtime Library相关的库。

        如果新建的工程是MFC工程或MFC DLL库,则必须包含MFC库。因此,我们新建工程的时候,如无必要,尽量新建为win32 console工程或win32 DLL工程,这样就不需要包含MFC的库。

        而另外两个CRT库是微软的VC++编译器依赖的C-Runtime库,不同的C/C++编译器有不同的C-Rumtime库。不同版本的编译器也不相同,故有msvcp*.dll和msvcr*.dll。


3,VS2015的CRT的变化

        到VS2015的时候,CRT的包含规则发生了一些变化,可以参考MSDN上Visual C++团队的博客:Introuducing the Universal CRT。具体包括:

1)msvcr*.dll不再存在了,它的功能被分散到编译器版本相关的”vcruntime140.dll“和操作系统相关的”ucrtbase.dll“。

2)”ucrtbase.dll“是操作系统的一部分,不能像之前的msvcr*.dll,直接拷贝到*.exe下就可运行,而是需要在runner上安装VS2015的”redis.exe“(redistribution)。

3)CRT相关的头文件、源文件和库文件从 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC 迁移到了C:\Program Files (x86)\Windows Kits\10 。

4)它包含有以下几个版本

### 如何在树莓派上实现脱机运行程序 要在树莓派上实现脱机运行程序,可以通过多种方式完成。以下是几种常见的方法及其具体配置: #### 方法一:通过 `cron` 定时任务设置开机自启 利用系统的定时任务工具 `cron` 来安排脚本或应用程序在系统启动时自动运行。 1. 打开终端并输入以下命令来编辑用户的 cron 表: ```bash crontab -e ``` 2. 添加如下条目以使某个脚本在开机时运行: ```bash @reboot /path/to/your/script.sh ``` 此处 `/path/to/your/script.sh` 是要执行的脚本路径[^1]。 3. 确保该脚本具有可执行权限: ```bash chmod +x /path/to/your/script.sh ``` --- #### 方法二:修改 `/etc/rc.local` 配置文件 这是另一种常用的方式,适合需要更高权限的任务(如 GPIO 控制)。 1. 使用文本编辑器打开 `/etc/rc.local` 文件: ```bash sudo nano /etc/rc.local ``` 2. 在文件中添加一行用于启动目标程序,例如: ```bash su pi -c "/home/pi/my_program.sh &" ``` 3. 保存文件并确保其具有正确的权限: ```bash sudo chmod +x /etc/rc.local ``` 需要注意的是,在某些较新的操作系统版本中,可能需要手动启用 `rc-local.service`: ```bash sudo systemctl enable rc-local sudo systemctl start rc-local ``` 对于涉及硬件接口(如 GPIO 或 PWM)的应用场景,这种方法尤为适用[^4]。 --- #### 方法三:使用 systemd 服务单元 现代 Linux 发行版推荐使用 `systemd` 来管理后台进程和服务。 1. 创建一个新的服务定义文件: ```bash sudo nano /etc/systemd/system/myservice.service ``` 2. 编写服务描述内容,例如: ```ini [Unit] Description=My Program Service After=network.target [Service] ExecStart=/usr/bin/python3 /home/pi/my_script.py Restart=always User=pi [Install] WantedBy=multi-user.target ``` 3. 加载新服务并设置为开机启动: ```bash sudo systemctl daemon-reload sudo systemctl enable myservice.service sudo systemctl start myservice.service ``` 这种方式更加灵活且易于维护,尤其适用于长期运行的服务型应用[^3]。 --- #### 方法四:针对特定设备(如 Raspberry Pi Pico) 如果使用的是一些专用开发板(比如 Raspberry Pi Pico),则需遵循不同的规则来进行脱机运行配置。 当希望某段代码随设备加电即刻被执行时,只需将其存储为主入口点文件名——通常是命名为 **main.py** 并上传至微控制器内部闪存即可达成目的[^2]。 --- ### 注意事项 无论采用哪种方案,请务必确认所依赖已正确安装以及环境变量已被适当初始化。此外测试阶段建议先手工验证各环节无误后再正式部署自动化流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值