【问题标题】:Why does the symbol of the SHA512 function in libeay32 not have a leading underscore?为什么 libeay32 中 SHA512 函数的符号没有前导下划线?
【发布时间】:2011-03-05 20:58:54
【问题描述】:

我正在尝试在我的 C++ 项目中使用 OpenSSL 的 SHA512 函数。为此,我在调用SHA512 并链接到libeay32.lib 库的源文件中包含openssl/sha.h

SHA512openssl/sha.h 中声明为:

extern "C" {
//...
unsigned char *SHA512(const unsigned char *d, size_t n,unsigned char *md);
//...
}

但是,在链接时,找不到符号:

mysql_sha.obj:错误 LNK2019:函数 _sha512 中引用的未解析外部符号 _SHA512

问题似乎是在libeay32.lib 中,函数的符号实际上是SHA512(没有前导下划线),我还看到__imp_SHA512,而通常它是__imp__SHA512

我使用的是 Shining Light Productions 的 Win64 build of OpenSSL 1.0.0d

为什么SHA512 函数的符号没有前导下划线?我该如何解决这个问题?

【问题讨论】:

  • 一个问题过于本地化了。更适合邮件列表。
  • 我不同意 Shaggy。为什么这个问题困扰你?
  • @Shaggy:它只是特定于 Windows 的“本地化”。我自己不使用该平台,但我知道由于某种原因它仍然很受欢迎。
  • @TonyK @MikeSeymour 它是本地化的,因为有人在为特定操作系统询问特定库的特定版本中的单个特定符号名称。这就是本地化的定义。这种细节更适合项目的邮件列表。
  • @Shaggy Frog:请注意,OP 的问题现已得到回答并被接受。我认为这是 stackoverflow 的成功。

标签: c++ c linker openssl x86-64


【解决方案1】:

64 位代码只有一种调用约定。没有__cdecl__stdcall__fastcall 等等的废话。任何想出另一个 x64 调用约定来节省几分之一纳秒的人都将被立即执行。因此,DLL 导出不再需要使用前导下划线和 @ 字符进行修饰。导出的名称只是普通的 SHA512。

不幸的是,这并不能解释为什么你的编译器仍然在前缀下划线。听起来您实际上是在使用 32 位编译器。

【讨论】:

  • 啊哈!我使用的是 Win32 配置。感谢您指出这一点。
猜你喜欢
  • 2012-01-31
  • 2011-04-02
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2010-09-18
相关资源
最近更新 更多