为什么在libeay32中SHA512函数的符号没有前导下划线?

时间:2011-03-05 20:58:54

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

我试图在我的C ++项目中使用OpenSSL的SHA512函数。为此,我在调用openssl/sha.h的源文件中加入SHA512并与libeay32.lib库链接。

SHA512openssl/sha.h中声明为:

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

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

mysql_sha.obj : error LNK2019: unresolved external symbol _SHA512 referenced in function _sha512

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

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

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

1 个答案:

答案 0 :(得分:12)

64位代码只有一种调用约定。没有__cdecl__stdcall__fastcall等等的废话。无论谁提出另一个x64调用约定来节省一小部分纳秒,都将被即时执行。因此,DLL导出不再需要使用前导下划线和@字符进行装饰。导出的名称只是简单的SHA512。

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