【问题标题】:Building project with static OpenSSL fails使用静态 OpenSSL 构建项目失败
【发布时间】:2020-06-26 12:28:59
【问题描述】:

我有以下测试代码来熟悉 OpenSSL 库:

#include <openssl/conf.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bio.h>


RSA* createRSA2(const char* key) {
    RSA* rsa = NULL;
    BIO* keybio;
    keybio = BIO_new_mem_buf(key, -1); // !!!
    if (!keybio) {
        return;
    }
    rsa = PEM_read_bio_RSA_PUBKEY(keybio, NULL, NULL, NULL);  // !!!
    if (!rsa) {
        return;
    }
    BIO_free(keybio); // !!!
    return rsa;
}

int main(void) {
    char publicKey[] = "-----BEGIN PUBLIC KEY-----\n"\
        "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy8Dbv8prpJ/0kKhlGeJY\n"\
        "ozo2t60EG8L0561g13R29LvMR5hyvGZlGJpmn65+A4xHXInJYiPuKzrKUnApeLZ+\n"\
        "vw1HocOAZtWK0z3r26uA8kQYOKX9Qt/DbCdvsF9wF8gRK0ptx9M6R13NvBxvVQAp\n"\
        "fc9jB9nTzphOgM4JiEYvlV8FLhg9yZovMYd6Wwf3aoXK891VQxTr/kQYoq1Yp+68\n"\
        "i6T4nNq7NWC+UNVjQHxNQMQMzU6lWCX8zyg3yH88OAQkUXIXKfQ+NkvYQ1cxaMoV\n"\
        "PpY72+eVthKzpMeyHkBn7ciumk5qgLTEJAfWZpe4f4eFZj/Rc8Y8Jj2IS5kVPjUy\n"\
        "wQIDAQAB\n"\
        "-----END PUBLIC KEY-----\n";
    
    const char* msg = "TESTMESSAGE";
    RSA* rsaKey = createRSA2(publicKey);

    printf("DONE\n");

    RSA_free(rsaKey);

    return 0;
}

它目前并没有真正做任何事情。在继续使用我的示例之前,我想知道如何静态链接 OpenSSL 库以获得独立的 exe。

目前我有以下设置:

  1. 已下载适用于 Windows 的 OpenSSL (https://slproweb.com/products/Win32OpenSSL.html)
  2. 更改了属性 -> VC++ 目录 -> 包含目录以包含 OpenSSL 的包含目录。
  3. C/C++ -> 代码生成 -> 将运行时库更改为“多线程/MT”
  4. 链接器 -> 常规 -> 更改了附加库目录以包含 OpenSSL 的“lib”目录。
  5. 链接器 -> 输入 -> 更改了附加依赖项以包含 libssl.lib 和 libcrypto.lib。

此代码编译良好,但 Visual Studio 还会生成应用程序所依赖的 DLL (libcrypto-1_1.dll)。如果我将 libssl.lib 和 libcrypto.lib 更改为 libssl_static.lib 和 libcrypto_static.lib,我会收到如下链接错误:

如何静态链接 OpenSSL 以接收独立的可执行文件?

编辑: 这是图片作为文本:

Error   LNK2019 unresolved external symbol __imp__WSAStartup@8 referenced in function _BIO_sock_init    Project2    C:\Users\User\source\repos\Project2\Project2\libcrypto_static.lib(b_sock.obj)   1   
Error   LNK2019 unresolved external symbol __imp__WSACleanup@0 referenced in function _bio_sock_cleanup_int Project2    C:\Users\User\source\repos\Project2\Project2\libcrypto_static.lib(b_sock.obj)   1   
Error   LNK2019 unresolved external symbol __imp__WSAGetLastError@0 referenced in function _BIO_accept  Project2    C:\Users\User\source\repos\Project2\Project2\libcrypto_static.lib(b_sock.obj)   1   

【问题讨论】:

  • 您收到的所有链接器错误消息都将在选项卡中以文本形式提供。请edit您的问题复制粘贴该文本。
  • 至于你的问题,当你链接一个静态库的时候,你也需要链接那个库的依赖。类似于 OpenSSL 的 Windows 套接字库。
  • 我编辑了原始问题。你能告诉我如何能够链接这些依赖项/找出我需要的吗?

标签: c visual-studio openssl


【解决方案1】:

要解决未解决的 Winsock 错误,请查看 OpenSSL 项目。阅读 Notes-Windows.txt。需要链接ws2_32.lib、crypt32.lib(其他库通常在Windows项目中默认链接)。

对于静态链接库,您可能需要build openssl *_static.lib。 顺序:克隆项目、安装构建实用程序、编辑生成文件以进行静态链接。

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2012-12-07
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多