用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法

问题:
在自己电脑上用VS2010编写的VC++程序(使用MFC库),不能在其他电脑上运行。双击提示:
“无法启动此程序,因为计算机中丢失mfc100.dll 尝试重新安装该程序以解决此问题。”

解决方案:
方案1.采用静态编译
      使用VS2010编译的程序在windows xp中运行时,经常会出现找不到相关的DLL文件,我们可以使用静态编译的方法把这些运行依赖文件打包到*.exe中来,以减少对环境的依赖。
一般可以配置以下两项:
(1)项目 -> **属性 -> 配置属性 ->  常规 -> MFC的使用 :在静态库中使用MFC。
(2)项目 -> **属性 -> 配置属性 ->  C/C++ -> 代码生成 -> 运行库 :多线程(/MT)。  (注:这里测试过要使用/MTD)

方案2.将mfc100.dll和应用程序一起打包发布,并在该包中加入安装控件的说明文件
附:mfc100.dll控件常规安装方法(说明文件):
①将下载来的mfc100.dll拷贝到指定目录(一般是system系统目录或放到软件同级目录里面),或者重新添加文件引用。 若您的系统是Windows XP/WIN7/Vista系统(32位),请将mfc100.dll复制到C:\Windows\System32目录下;若您的系统是64位,请将文件复制到C:\Windows\SysWOW64目录。
②点击 开始 -> 运行,输入"regsvr32 mfc100.dll",回车即可解决。

或者将下面的代码保存为“注册.bat”(方法:新建.txt文档,打开文档输入代码后保存关闭,更改文件名及扩展名为“注册.bat”),放到dll文件同级目录(只要在同一个文件夹里面有这两个文件即可),双击注册.bat,就会自动完成mfc100.dll注册(win98不支持)。
下面是32系统的注册bat文件(64位的请将下面的system32替换为SysWOW64即可。)
代码如下:
@echo 开始注册
copy mfc100.dll %windir%\system32\
regsvr32 %windir%\system32\mfc100.dll /s
@echo mfc100.dll注册成功
@pause

方案3.将程序和vcredist_x86.exe一起打包发布(或提示用户下载并安装vcredist_x86.exe)
下载并安装vcredist_x86.exe即可。
vcredist_x86.exe下载地址:
 
 
 
 
 

vc链接静态库的时候要注意的问题

 

vc工程与被链接的静态库(*.lib)文件之间要保持一致:

例如:   是共享模式使用MFC dll还是静态模式使用MFC dll?

是多线程还是单线程?

是调试模式还是release模式?

涉及的项目属性配置   /MDd    与   /MTd    /MD   /MT


如果不一致,在链接阶段会报告错误,如:
LIBCMT.lib(invarg.obj) : error LNK2005: __initp_misc_invarg 已经在 libcmtd.lib(invarg.obj) 中定义

或者函数无法解析


附(ZT)

1、VC编译选项
多线程 (/MT)
多线程调试 (/MTd)
多线程 DLL   (/MD)
多线程调试 DLL   (/MDd)

 

2、C 运行时库                                     库文件
Single thread(static link) ML                   libc.lib
Debug single thread(static link) MLd          libcd.lib
MultiThread(static link) MT                   libcmt.lib
Debug multiThread(static link) MTd            libcmtd.lib
MultiThread(dynamic link) MD                   msvcrt.lib
Debug multiThread(dynamic link) MDd msvcrtd.lib 

 

3. 各种 C 运行时库的区别

 

(1)静态链接的单线程库
静态链接的单线程库只能用于单线程的应用程序, C 运行时库的目标代码最终被编译在应用程序的二进制文件中。通过 /ML 编译选项可以设置 Visual C++ 使用静态链接的单线程库。

 

(2)静态链接的多线程库
静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过 /MT 编译选项可以设置 Visual C++ 使用静态链接的多线程库。

 

(3)动态链接的运行时库
动态链接的运行时库将所有的 C 库函数保存在一个单独的动态链接库 MSVCRTxx.DLL 中,MSVCRTxx.DLL 处理了多线程问题。使用 /MD 编译选项可以设置 Visual C++ 使用动态链接的运行时库。
/MDd 、 /MLd 或 /MTd 选项使用 Debug runtime library( 调试版本的运行时刻函数库 ) ,与 /MD 、 /ML 或 /MT 分别对应。 Debug 版本的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上 Release 版本。 

 

4、下面是msdn关于Visual C++ 编译器选项的说明:
这些选项选择单线程或多线程运行时例程,指示多线程模块是否为 DLL,并选择运行时库的发布版本或调试版本。
(1) /MD        定义 _MT 和 _DLL 以便同时从标准 .h 文件中选择运行时例程的多线程特定版本和 DLL 特定版本。此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR71.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。当在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时,它将导致应用程序通过静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 进行链接,同时仍通过 msvcrt.lib 动态链接到主 CRT。

 

(2) /MDd       定义 _DEBUG、_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。

 

(3) /ML       使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。

 

(4) /MLd        定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。

 

(5) /MT       定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。创建多线程程序需要 /MT      或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。

 

(6) /MTd       定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。创建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。

 

(7) /LD        创建 DLL。将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。链接 DLL 启动代码。如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。将 /Fe 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll 而不是基名称.exe。如果还未显式指定 /M 选项之一,则将默认运行时库支持更改为 /MT。

 

(8) /LDd        创建调试 DLL。定义 _DEBUG。警告    不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在 .exe 文件内部既使用静态版本又使用动态版本链接,但您仍可以使用运行时库的两个(或更多)副本。例如,当与用动态 (DLL) 版本的运行时库链接的 .exe 文件一起使用时,用静态(非DLL)版本的运行时库链接的动态链接库可能导致问题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在其他电脑运行一个.exe文件时,如果出现了"无法定位程序输入点于动态链接库"的错误提示,这通常是因为目标电脑缺少了所需的动态链接库文件。这个错误的提示表明需要的库文件ucrtbase.terminate没有被找到。要解决这个问题,你可以按照以下步骤进行操作: 1. 确认目标电脑上是否已安装了相应的运行时库。如果目标电脑上没有安装该库,则可以尝试下载并安装适合目标电脑运行时库。在这个例子中,缺少的是msvcr80.dll。你可以在微软的官方网站上下载适用于你的操作系统版本的Microsoft Visual C++ Redistributable Package,然后安装它。 2. 如果已经安装了运行时库,但问题仍然存在,你可以尝试将缺失的库文件复制到目标电脑的指定目录中。首先,在正确的来源电脑上找到msvcr80.dll文件,然后将其复制到目标电脑的系统目录(通常是C:\Windows\System32)或应用程序所在的目录。然后,尝试重新运行.exe文件,看看问题是否解决。 总结起来,解决"无法定位程序输入点于动态链接库"的问题的关键在于找到缺失的动态链接库文件并将其安装或复制到正确的位置。希望这些方法对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [无法定位程序输入点于动态链接库修复解决方法](https://blog.csdn.net/weixin_36014846/article/details/118476126)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [无法定位程序输入点 于动态链接库怎么办](https://blog.csdn.net/weixin_36127082/article/details/117219022)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值