2

我正在尝试使用 botan 加密库运行最基本的程序。我正在使用 Botan 1.10 32 位。我在 Windows 7 上使用他们的安装程序获得了二进制文件。IDE 是 Visual Studio 2012。

我将我的项目链接到botan.lib,但程序在启动时报告缺少botan.dll,所以我假设lib 只是链接到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 检测到一切正常。当我尝试调试时,我得到:

rsa.exe 中 0x6A1F2AA0 (botan.dll) 的第一次机会异常:0xC0000005:访问冲突读取位置 0x00310000。rsa.exe 中 0x6A1F2AA0 (botan.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00310000。

似乎在 botan.dll 中引发了一个异常,我无法在我身边抓住它。我不能从这里走得更远。

我在链接到图书馆时做错了什么还是有其他问题?帮助表示赞赏。

4

3 回答 3

4

扩展我的评论:

如果您的程序即使在您的程序的发布版本中崩溃,您将不得不下载源代码并自己构建它(需要 python 来配置构建)。

如果发布版本没有崩溃,您可以/RTCs Stack Frames在您的调试版本的项目设置中禁用运行时检查C++/Code Generation,这似乎会导致崩溃。只需将设置从 更改Both/RTCu Uninitialized Variables 或通过将其设置为完全禁用它Default

由于这是一种解决方法而不是解决方案,因此您应该考虑自己构建 botan 并构建发布版本和调试版本(然后您可以在调试版本中链接到调试版本并保留调试运行时检查原样。

请参阅有关如何构建它的文档(您需要python来运行配置):

构建发布版本(默认)后,将以下文件复制到另一个目录(例如C:\Botan\release\),否则在构建调试版本时它们将被覆盖:

  • botan.dll
  • 植物学
  • 植物学库
  • botan.dll.manifest

现在再次运行配置,这次添加--enable-debug选项:

> python configure.py --cc=msvc --enable-debug

并再次构建它。这一次,将文件(上面列出的)复制到C:\Botan\debug\.

将您的项目配置为链接到调试目录中的库以进行调试构建,以及链接到发布目录中的库以进行发布构建。最后确保您的程序在运行时加载适当的 DLL。

于 2012-12-27T20:23:08.737 回答
0

您使用的二进制文件可能是针对发布模式的。我尝试在调试模式下链接,也遇到了访问冲突,然后我切换到发布模式,一切正常。我也不确定二进制文件是否针对 VC110。您可以下载源代码并尝试使用您喜欢的配置来构建它。

于 2012-12-27T10:37:46.393 回答
-1

由于这是 Windows,您将永远不会看到 C++ 异常跨越模块边界。因此,您捕获 C++ 异常的尝试将无法识别这一异常。如果您想处理访问冲突,您将需要使用结构化异常处理

要找出 .dll 崩溃的原因,您应该将 Visual Studio 设置为在生成访问冲突时中断调试器。转到Debug -> Exceptions并勾选Win32 Exceptionsc0000005 Access violation的Thrown复选框。一旦进入调试器,您就可以加载调试符号(假设它们可用)。调用堆栈和参数应该可以让您很好地了解它失败的原因。

由于源似乎可用,您也可以自己编译一个 Debug .dll。这既会产生正确的调试符号,也会启用崩溃的源代码级调试。这可能会为您提供诊断手头问题所需的所有信息。

于 2012-12-26T16:47:30.693 回答