遇到这个问题是我正在用vc2008 调试一个 C++写的 Dll,dll 在编译中没有报错,但在用VB.net写的程序调用此 Dll 时,才会报告 于 "xxx.dll 中找不到 XXX 函数的入口点"。所以我转的对 Dll 断点调试,结果另一问题:“当前不会命中断点,还未为文档加载任何符号”。
查找解决办:网点有很多,都不是完美解决问题。其中一个解决办法是:
在 /工具/选项/调试/常规 :取消勾选 "要求源文件与原始版本匹配"。

现在 dl 可以调试了 ,但“当前不会命中断点,还未为文档加载任何符号”的提示还在。在断点可命中了。调用 dll 时的错误:"xxx.dll 中找不到 XXX 函数的入口点" 仍在。
经过多次试错,终于找到了原因。上述我遇到 的两个问题,其实是一个原因产生,也是一个办法解决了 2 个问题。
最终原因:

dll的 定义文件 XXX.def,虽然已经添加到项目的解决方案中,但还没有如图 1 在项目/属性/链接属性/ 输入/模块定义文件 中"正确"绑定 .def 文件,且此 def 文件 必须写 Dll 文件同名, Dll才能被正确编译,否则编译会报告: def 中定义中 XXX 函数 无法解析。
并且在没有 由项目属性中绑定 ”链接/输入/模块定义文件“ *.def 文件时。 即使一个 .def 文件被添加进入 项目解决方案目录中, dll 被编译时,编译过程中链接器还是会无视 此.def 文件。此时 dll 中的函数不会被写入目标 Dll 中,所以此时编译出来的 dll 体积 很小,甚至 0KB 。 此时编译并不报错。 在编译完成后,有程序 调用此 Dll 时,才会报告 于 "xxx.dll 中找不到 XXX 函数的入口点"
所以此时编译出来的 Dll 与 Dll的源文件内容是不匹配的, 所以 vs 会报告:“要求源文件与原始版本匹配” 检查出错, 也正时因为 此时编译出来的 Dll 内的函数不全,与 Dll 源代码不匹配, 所有之后 dll 的断点调试中 才会出现 "此断点无法命中,没有为此文档加载任何符号"。
最终解决办法:正确地在项目属性的配置属性/链接/输入 中绑定 模块定义文件(XXX.def )。
本文介绍了在使用VC2008调试C++ DLL时遇到的“当前不会命中断点,还未为文档加载任何符号”以及“找不到函数入口点”问题。通过分析发现,这两个问题的根源在于DEF文件未正确绑定到项目属性中。正确绑定DEF文件后,调试和入口点问题得到解决。
5910

被折叠的 条评论
为什么被折叠?



