mt.exe:general error c101008d(最终原因已查明)

本文介绍了 mt.exe:generalerrorc101008d 错误的解决方案,包括修改项目属性来禁用生成清单或嵌入清单,以及确保编译前关闭所有相关文件。最终确定错误是由杀毒软件持有文件句柄导致。

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

mt.exe:general error c101008d(最终原因已查明)_算法的天空_百度空间  

2011-05-27 16:22:41|  分类: 坑爹软件问题 |  标签: |字号 订阅

 
 
算法的天空
本博客非注明的文章节录或全部来自互联网,本人转载并不表示明确的或暗示的任何对这些内容的支持或反对,仅仅作为转载.本人不对文章的正确性,有效性,适用性做任何明确的或暗示的保证.
mt.exe:general error c101008d(最终原因已查明)
2010年03月02日 星期二 下午 07:21
警告较为简单,主要是使用了原来RTL中字符串处理函数如strcpy等现在被认为不安全的函数造成的。

而错误就让人纳闷了,该错误为:

mt.exe : general error c101008d: Failed to write the updated manifest to the resource of file ".\Release\jiaoshi.exe". f

上网找了一下,只有英文网页有相关讨论,懒得去翻译了。中文网页中倒是有一个,而且有解决办法,那就是在项目属性——配置属性——链接器——清单文件中, 把生成清单改成否就行了。

经过进一步的探索,发现在项目属性——配置属性——清单工具——输入和输出中,把嵌入清单改成否也行。

然而,问题虽然解决了,原因却还不明。因为,既然生成清单和嵌入清单是微软的默认设置,为什么却会出现错误呢?第一种方法的作者认为清单是.net程序 (托管程序)需要的,所以去掉后便能正常生成了,然而后一种方法仍然生成了清单,而且也能正常运行又作何解,而且微软的说明中也没有提到清单只是为CLR 程序准备的,而是应该所有程序都要加上清单。

更新:还有一种更简单的方法:如果编译前将所有打开的与该项目有关的文件都关掉,也可以解决问题。

最终原因已查明
由于VC需要把生成的文件中嵌入MANIFEST文件,而由于杀毒软件之类的会握有这个文件句柄(因为杀毒软件
发现这个EXE,DLL正在读写),于是VC就写不进去了,方法是暂时关闭杀毒软件,这样就不用
改写MANIFECT
我用的是瑞星杀毒软件,有这个问题.
Hi,

This might be due to antivirus holding open handle on the exe generated and thus when VS tries to embed the manifest it fails with access denied.
Is Antivirus running on your machine? Does this repro with Antivirus turned off?

If above is not the case can you provide us with a repro.

Thanks,

VC++ Team
<think>好的,我现在需要解决用户提到的Visual Studio中的LNK2005和LNK1169链接器错误。首先,我要回忆一下这些错误通常是什么原因引起的。根据用户提供的引用内容,这些错误通常与重复定义符号有关,尤其是_main函数被多次定义。 用户提供的引用[1]、[2]指出_main已经在不同的.obj文件中定义,这可能是由于多个源文件包含了main函数,导致链接时出现冲突。而引用[3]提到,混合使用不同的C运行时库(如libcmt.lib和msvcrt.lib)也可能导致LNK2005错误。引用[4]则提到了__cinit的重复定义,这可能与库的冲突有关。 接下来,我需要整理这些可能的原因,并给出对应的解决方案。首先检查是否有多个main函数定义,然后查看项目设置中的库链接情况,确保没有混合使用不同版本的C运行时库。另外,还要考虑头文件中的函数定义是否被多次包含,导致重复定义。 用户的问题是如何解决这些链接错误,因此需要一步步引导他们检查代码和项目配置。可能需要建议他们检查源文件、项目设置中的库链接、预处理指令如#pragma once的使用,以及如何处理第三方库的冲突。 最后,生成相关问题,帮助用户进一步理解和预防类似错误的发生。例如,如何避免符号重复定义,或者如何正确配置Visual Studio的运行时库选项等。</think>### 解决Visual Studio LNK2005和LNK1169链接错误 #### 错误原因分析 1. **符号重复定义** - LNK2005表示符号(如函数、变量)在多个源文件或库中被重复定义[^1][^2]。 - LNK1169是LNK2005的连锁错误,表示链接器发现多个重复符号无法继续链接[^2]。 - 常见场景:多个`.c`/`.cpp`文件包含`main()`函数,或头文件中直接定义非内联函数。 2. **C运行时库(CRT)冲突** - 混合使用不同版本的CRT库(如`libcmt.lib`与`msvcrt.lib`)会导致`__cinit`等内部符号冲突[^3][^4]。 3. **第三方库兼容性问题** - 引用的第三方库可能使用了与项目不同的CRT配置(如静态库与动态库混用)。 --- #### 分步解决方案 1. **检查重复定义的符号** - 确保项目中只有一个源文件包含`main()`函数。 - 在头文件中使用`#pragma once`或`#ifndef`防止重复包含。 - 若变量/函数需全局使用,头文件中用`extern`声明,源文件中定义: ```c // header.h extern int global_var; // 声明 // source.c int global_var = 0; // 定义 ``` 2. **统一CRT库配置** - 进入项目属性 → **C/C++ → 代码生成 → 运行时库**,确保所有子项目配置一致: - `/MT`:静态多线程CRT - `/MD`:动态多线程CRT - 若使用第三方库,需确认其编译时使用的CRT版本与项目一致[^3]。 3. **检查链接库的引用** - 进入项目属性 → **链接器 → 输入 → 附加依赖项**,移除重复或冲突的库。 - 若使用预编译头文件(`stdafx.h`),确保其仅被主项目引用。 4. **处理第三方库冲突** - 优先使用动态链接库(`.dll`)代替静态库(`.lib`)。 - 若必须使用静态库,在项目属性 → **链接器 → 命令行**添加: ``` /FORCE:MULTIPLE ``` (注意:此选项可能掩盖潜在问题,需谨慎使用) --- #### 示例配置修正 ```plaintext 项目属性 → C/C++ → 代码生成 → 运行时库 → 选择 /MDd(调试模式)或 /MD(发布模式) 项目属性 → 链接器 → 输入 → 附加依赖项 → 仅保留必需的库 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值