一个C++代码DEBUG时跳到错误的函数中的怪问题
2011-12-13 15:22
399 查看
一个C++代码DEBUG时跳到错误的函数中的怪问题
近日写了一个加解密库,因为要在C#中访问,因此该库全部定义为API接口并通过.def文件申明外漏的接口,Debug版本的输出文件是DDToolsD.dll,Release版本的输出文件是DDTools.dll
其中有一个接口用于通过SHA1计算HASH,因为要在C#中调用,将HASH值转换为HEX Code以后返回
生成HEX Code的函数名为Buffer2Hex,解码HEX Code的函数名为Hex2Buffer,在调试SHA1接口的时候发现,代码中明明写的是调用Buffer2Hex,但是程序总是会跳到Hex2Buffer中
第一反应就是PDB与代码不匹配,删除ncb文件,删除Debug目录,删除DLL输出目录,Rebuild一下,问题照旧。
第二反应是.def文件定义的接口不对,仔细检查了,没有发现问题
第三反应是VS用了比较老的缓存中的DLL文件,看了一下modules中的定义发现路径是正确的,但是link的文件好像不对,debug版本link的是DDTools.dll,正确的应该是DDToolsD.dll
找了一下原因,发现在库的.def文件里面写了LIBRARY="DDTools"字样
查了一下MSDN原始描述是:
The first statement in the file must be the LIBRARY statement. This statement identifies the .def file as belonging to a DLL. The LIBRARY statement is followed by the name of the DLL. The
linker places this name in the DLL's import library.
问题出在这里,LIBRARY中定义的DDTools会包含在输出的lib中,因此上层在调用的时候会弄错文件
在Debug与Release分别输出DDTools.dll解决了这个问题,直接删除LIBRARY="DDTools"字样也解决了这个问题
That's all.
近日写了一个加解密库,因为要在C#中访问,因此该库全部定义为API接口并通过.def文件申明外漏的接口,Debug版本的输出文件是DDToolsD.dll,Release版本的输出文件是DDTools.dll
其中有一个接口用于通过SHA1计算HASH,因为要在C#中调用,将HASH值转换为HEX Code以后返回
生成HEX Code的函数名为Buffer2Hex,解码HEX Code的函数名为Hex2Buffer,在调试SHA1接口的时候发现,代码中明明写的是调用Buffer2Hex,但是程序总是会跳到Hex2Buffer中
第一反应就是PDB与代码不匹配,删除ncb文件,删除Debug目录,删除DLL输出目录,Rebuild一下,问题照旧。
第二反应是.def文件定义的接口不对,仔细检查了,没有发现问题
第三反应是VS用了比较老的缓存中的DLL文件,看了一下modules中的定义发现路径是正确的,但是link的文件好像不对,debug版本link的是DDTools.dll,正确的应该是DDToolsD.dll
找了一下原因,发现在库的.def文件里面写了LIBRARY="DDTools"字样
查了一下MSDN原始描述是:
The first statement in the file must be the LIBRARY statement. This statement identifies the .def file as belonging to a DLL. The LIBRARY statement is followed by the name of the DLL. The
linker places this name in the DLL's import library.
问题出在这里,LIBRARY中定义的DDTools会包含在输出的lib中,因此上层在调用的时候会弄错文件
在Debug与Release分别输出DDTools.dll解决了这个问题,直接删除LIBRARY="DDTools"字样也解决了这个问题
That's all.
相关文章推荐
- 写C++代码遇到的一个问题,错误已经在代码中注释了
- 关于“C++ vs2010中声明一个类的函数,提示不兼容”问题
- 一个问题阻止windows正确检查次机器的许可证,错误代码:Ox80070002
- 解决vc++DEBUG ERROR问题前几天师弟调试程序的时候出现了这样一个错误,出错的位置是在delete [] 一个动态分配的数组时出现的。 经过调查发现错误是因为他之前在给数组赋值的时候越界了
- 一个问题阻止windows正确检查此机器的许可证。错误代码0x80070002
- 求数组子数组之和最大值问题-犯了一个很2B的错误,函数参数啊函数参数
- c++沉思录笔记(21章代码)通过函数对象解决c++的函数嵌套问题
- 解决方案:静态成员对象的声明在头文件中,函数代码在另外一个文件中,提示链接错误
- __try 内外不能有 c++ 代码,要封装成一个函数
- 一个问题阻止windows正确检查此机器的许可证 错误代码:0x80070002
- 从一段经典错误代码说起——关于局部变量指针和函数传参的问题分析
- UserControl 的一个值得注意的问题 [属性" * "的代码生成失败.错误是:"程序集"*.Version=1.0.0.0,Culture=neutral,..........无标记为序列化"
- C++调用Android函数弹出一个提示框中出现的问题总结
- 写一个函数,可以处理C++代码,将其中的注释去掉
- 在C++里一个类成员函数多少行代码才是最好呢?
- # include <errno.h >查看错误代码errno是调试程序的一个重要方法。当Linux C API函数发生异常时,一般会将errno变量赋值一个整数,不同的值表示不同的含义,可以通过查看
- emacs erlang ,debug,高亮,函数跳转,重构,错误提示,自动补全。一个都不少
- 一个非常简洁有效的判断IP地址格式是否正确的函数,c++代码
- 一个问题阻止windows正确检查此机器的许可证。错误代码0x80070002
- 使用dx9渲染的一个找不到函数代码的问题