--------------------------------本文分2部分 第1部分:解决方法 第2部分:补充了解资料,为什么这样做--------------------------------
---------------------------------------------------------------- 第1部分:解决方法----------------------------------------------------------------
错误原因:这种是在静态库时,才会出现的错误,缺少了vc100.pdb(VS2010是vc100.pdb,VS2008,是vc90.pdb依此类推)
这里除了静态库.lib,还需要vc100.pdb这个文件(在debug目录下)
错误提示:
1>------ 已启动生成: 项目: patch, 配置: Debug Win32 ------
1>生成启动时间为 2011-7-21 15:33:02。
1>InitializeBuildStatus:
1> 正在对“Debug\patch.unsuccessfulbuild”执行 Touch 任务。
1>ClCompile:
1> 所有输出均为最新。
1> 所有输出均为最新。
1>ManifestResourceCompile:
1> 所有输出均为最新。
1>vpatch_sdk.lib(adler32.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(apply_patch.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(checksum.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(Checksums.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(ChunkedFile.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(FileFormat1.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(main_gen.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(main_regen.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(md5.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(PatchGenerator.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(POSIXUtil.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(vpatch_sdk.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(adler32.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(apply_patch.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(checksum.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(Checksums.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(ChunkedFile.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(FileFormat1.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(main_gen.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(main_regen.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(md5.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(PatchGenerator.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(POSIXUtil.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1>vpatch_sdk.lib(vpatch_sdk.obj) : warning LNK4204: “D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\vc100.pdb”缺少引用模块的调试信息;正在链接对象,如同没有调试信息一样
1> 打补丁工具.vcxproj -> D:\公司SVN\fallingdown下午要更新的\server\打补丁工具\Debug\patch.exe
1>FinalizeBuildStatus:
1> 正在删除文件“Debug\patch.unsuccessfulbuild”。
1> 正在对“Debug\patch.lastbuildstate”执行 Touch 任务。
1>
1>生成成功。
1>
1>已用时间 00:00:02.85
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
以下摘抄:补充为什么需要vc100.pdb这个文件的原因
转载网址 http://www.cnblogs.com/wintech/archive/2010/06/11/1756606.html
注:本文所提到的符号均是指微软PDB格式的符号。
调试信息的历史回顾
连接二进制指令和源代码之间的纽带——符号是如何被编译器生成的呢?要具体了解这个内容我们需要先简单回顾一下微软调试信息格式的历史。
COFF:
最早的调试信息格式是COFF格式,这种格式内嵌到可执行文件中的,它能记录函数、变量、行号、FPO等信息。
CodeView:
随后就是比较熟悉的CodeView了。这种调试信息的格式提供了内嵌和分离两种形式,和PDB唯一的不同就是没有编辑并继续的功能。独立的CodeView调试信息存储在.dbg文件中。
PDB:
而微软最新的调试信息格式就是PDB(Program Data Base)了。这种调试信息和可执行文件是完全分离的。他记录了很多丰富的信息,同时还提供了调试并继续、增量链接的功能。不过这种调试信息的格式并没有官方的公开文档,要操作它一般只有通过debughelp或者DIA。PDB又分为两种格式,一种是vc6使用的PDB2.0,后来的版本则全是PDB7.0。PDB7.0是不能向下兼容的。
编译器产生符号的过程
我们看到调试信息是逐步发展的,最新的调试信息格式为PDB7.0。这是一种和可执行文件分离的格式。对于可执行文件,一般只有几百字节的额外负担。下面我们仅讨论PDB这种调试信息格式。
如果指定生成调试信息,编译器在每次编译完文件以后就会产生一个obj文件,然后同时产生它对应的调试信息。当我们进行连接的时候,编译器就会帮我们把所有obj统一编译为一个可执行文件,然后所有的调试信息统一生成一个PDB文件。
如果我们是生成静态库,那么编译器编译完各个源代码以后会统一产生lib文件,同时也将所有的调试信息生成到一个pdb中。如果我们在编译可执行文件的同时需要使用某一个静态库,那么编译器也需要使用到静态库的调试信息,最终可执行文件和调试信息都被单独地生成。
静态库的符号问题
曾经遇到过一个问题,就是使用了vc6编译的静态库,然后在vs2008中进行链接。结果每次链接的时候都产生警告,提示没有找到静态库的符号,结果就像没有调试信息一样。这个问题研究很久无果。
后来自习研究了一下静态库的编译方式才解决了问题。上面已经提到,静态库的PDB是每个文件的调试信息的集合,而默认情况下静态库生成的PDB文件都是VCX0.PDB,例如vs2008就是VC90.PDB,VS2010就是VC100.PDB。生成静态库以后,最终的可执行程序进行链接时候,就会根据lib中各个obj记录的信息区找VCX0.PDB,而这个文件就是我们需要的。如果我们要链接很多个静态库,可能就需要在编译静态库的时候/FD给静态库的符号重命名了。
这一点在.NET中解决得很好,所有依赖的程序集符号都会被自动保存,并且程序集之间的符号不会合并为一份。
符号的生成非常简单,几个编译选项就搞定,默认情况下DEBUG模式都会产生编辑并继续的符号,而Release模式建议也使用/Zi来产生对应调试信息。