我试着用僵尸密码库运行最基本的程序。我使用的是Botan 1.10 32位。我在Windows 7上获得了带有安装程序的二进制文件。IDE是Visual 2012。
我将我的项目链接到botan.lib,但是程序在启动时报告缺少一个botan.dll,所以我假设库只是链接到dll。因此,我将botan.dll放在Debug文件夹中。
现在是问题所在。
#include <iostream>
#include <botan/botan.h>
using namespace Botan;
using namespace std;
int main(int argc, char* argv[]) {
try {
cout << "d1";
LibraryInitializer init; //exception thrown here
}
catch(exception& e) {
cout << "Exception caught: " << e.what() << std::endl;
}
cout << "d2";
return 0;
}Intellisense检测一切正常。当我尝试调试时,我得到:
第一次机会异常0x6A1F2AA0 (botan.dll)在rsa.exe: 0xC0000005:访问冲突读取位置0x00310000。0x6A1F2AA0 (botan.dll)处的未处理异常( rsa.exe: 0xC0000005:访问冲突读取位置0x00310000 )。
似乎在botan.dll中抛出了一个异常,我无法从我这一边捕捉到它。我不能再离开这里了。
我是做错了链接到图书馆还是有其他问题?帮助感激。
发布于 2012-12-27 20:23:08
关于我的评论,我想补充一下:
如果您的程序即使在发布版本的情况下也会崩溃,您将不得不下载源代码并自己构建它(配置构建需要python)。
如果发布版本没有崩溃,您可以禁用/RTCs Stack Frames运行时签入调试生成的C++/Code Generation项目设置,这似乎是导致崩溃的原因。只需将设置从Both更改为/RTCu Uninitialized Variables,或通过将其设置为Default完全禁用它。
由于这是一个解决方案,而不是解决方案,因此您应该考虑自己构建僵尸,同时构建发布版本和调试版本(然后您可以链接到调试版本中的调试版本,并保留调试运行时检查的原样。
关于如何构建它,请参考文档 (您需要python来运行配置):
生成发行版(默认)后,将以下文件复制到另一个目录(例如C:\Botan\release\),否则在构建调试版本时会覆盖这些文件:
现在再次运行配置,这一次添加--enable-debug选项:
> python configure.py --cc=msvc --enable-debug再建一次。这一次,将文件(上面列出的)复制到C:\Botan\debug\。
将项目配置为链接到用于调试生成的调试目录中的库和用于发布生成的发布目录中的库。最后,确保程序在运行时加载适当的DLL。
发布于 2012-12-27 10:37:46
您使用的二进制文件可能是针对发布模式的。我试着在调试模式下链接,也得到了访问冲突,然后我切换到发布模式,一切都很好。我也不确定二进制文件是否瞄准了VC110。您可以下载源代码,并尝试使用您更好的配置构建它。
发布于 2012-12-26 16:47:30
因为这是Windows,所以您将永远不会看到跨越模块边界的C++异常。因此,试图捕获C++异常将无法识别此异常。如果您想获得访问冲突,您将需要使用结构化异常处理代替。
若要了解.dll崩溃的原因,应设置Visual,以便在生成访问冲突时侵入调试器。转到“调试->异常”并在“c0000005异常”下勾选引发的c0000005访问冲突复选框。在调试器中,您可以加载调试符号(假设它们是可用的)。调用堆栈和参数应该会让您很好地了解其失败的原因。
因为源代码似乎是可用的,所以您也可以自己编译一个调试.dll。这既会产生正确的调试符号,也会启用崩溃的源级调试。这可能会为您提供诊断手头问题所需的所有信息。
https://stackoverflow.com/questions/13964404
复制相似问题