【问题标题】:linker error with openssl (trying SH1 example)openssl 的链接器错误(尝试 SH1 示例)
【发布时间】:2014-04-27 21:54:31
【问题描述】:

我正在尝试编译一个如何实现 SHA1 的示例,但我不断收到此错误:

[Linker Error] Unresolved external '_SHA1' referenced from C:\PROGRAM FILES (X86)\BORLAND\CBUILDER6\PROJECTS\UNIT1.OBJ

我从他们的网站下载了 openssl 文件,我尝试将 headers 目录复制到我的项目目录并将其复制到我的包含目录,但没有。

这是示例代码:

#include <string.h>
#include <openssl/sha.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    int i;
    unsigned char ibuf[] = "compute sha1";
    unsigned char obuf[20];

    SHA1(ibuf, strlen(ibuf), obuf);

    for (i = 0; i < 20; i++) {
        printf("%02x ", obuf[i]);
    }
    printf("\n");

    return 0;
}x

P.S:我正在使用 Borland C++ Builder 6

【问题讨论】:

  • 这是一个链接错误。您的项目未设置为与 OpenSSL libcrypto 库链接。似乎您在 Windows 程序中使用 libcrypto 的说明中途停止了。谢天谢地(对我来说)我使用 Visual Studio,所以我不知道在 BC-builder 中在哪里添加库路径和链接器指令。但是在您的文档中深入挖掘,您会发现它。
  • Borland C++ Builder 6(大约 2002 年)在大多数标准中都是古老的。如果你不介意我问,你为什么要使用它?
  • @noloader 我正在使用它,因为我的导师给了我。
  • @noloader:我在日常工作中使用 C++Builder 6,因为我的雇主要求我这样做。 OpenSSL 在其中工作得很好。您不应该批评人们对开发工具的选择。
  • 雷米 - 这不是批评。我只是好奇为什么要使用这些工具。这与有人说“我正在使用 Fedora 1(大约 2003 年)作为我的网络服务器平台”的好奇心没有什么不同。另外,由于运行时不同,Shining Light 的 Win32OpenSSL 和 C++ Builder 之间可能存在兼容性问题。

标签: c++ openssl c++builder sha


【解决方案1】:

您可以通过“添加到项目...”将 OpenSSL .lib 文件添加到您的项目中或使用#pragma comment

#pragma comment(lib, "ssl_lib_file_here.lib")

int main(int argc, char* argv[])

【讨论】:

  • 是的,只是在我下载的安装程序安装的目录中没有扩展名为“.lib”的文件。有一个包含标题的文件夹“包含”。我试图将这些标题添加到我的项目中,但没有结果..
  • 您也可以使用implib 从相应的DLL 中获取libeay32.liblibssl32.libssleay32.lib 并将它们添加到项目中。
  • @DmitrySokolov:复制随附的 .lib 文件将不起作用,因为它们适用于 VC++ 并且与 BCB 不兼容。在 DLL 上调用 IMPLIB 是正确的解决方案。
  • @MoheTheDreamy: IMPLIB (IMPort LIBrary) 不会转换 现有的 .lib 文件。它直接读取源 DLL 文件,然后创建IMPLIB 所属的编译器兼容的新 .lib 文件。
  • 您只需要头文件和 .lib 文件,不要忘记使用已编译的可执行文件部署 DLL。
【解决方案2】:

我从他们的网站下载了 openssl 文件,

还有

...除了我下载的安装目录中没有扩展名为“.lib”的文件

您需要使用Shining Light's Win32OpenSSL 或自己构建OpenSSL。

如果你使用 Shining Light 的版本,一切都已经构建好了。虽然 Thomas Hruska 使 Win32OpenSSL 与 OpenSSL 版本保持同步,但我认为他没有提供与您正在使用的 C++ Builder 6(大约 2002 年)版本兼容的任何东西。

如果您想从 Win32 平台上的源代码构建 OpenSSL,请查看 OpenSSL 发行版根目录中的 INSTALL.W32INSTALL.W64

我相信您还有第三种选择。该选项是获取现代 IDE。 Microsoft 提供了Visual Studio 的试用版(试用版链接在页面右侧)。 Embarcadero 还提供C++ Builder XE5 的免费试用版。两者都应该与 Shining Light 的 Win32OpenSSL 一起使用。

【讨论】:

  • Shining Light 的 OpenSSL DLL 与 C++Builder 6 配合得很好。我自己使用它们。您所要做的就是使用命令行IMPLIB 工具为C++Builder 创建一个导入.lib 文件,然后将该文件添加到您的项目中。标准的 OpenSSL 头文件可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2014-10-28
  • 2017-05-15
  • 2013-05-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多