【问题标题】:How to compile program with OpenSSL on Windows with MinGW如何使用 MinGW 在 Windows 上使用 OpenSSL 编译程序
【发布时间】:2016-04-17 12:05:58
【问题描述】:

我尝试从 fm4dd.com 运行此示例代码。但我不知道如何将头文件实际 include 到我的程序中。 原来是这样的:

#include <openssl/bio.h>

但我将其更改为他们的实际路径,但仍然出现错误。

#include <C:\openssl\include\openssl\bio.h>
#include <C:\openssl\include\openssl\err.h>
#include <C:\openssl\include\openssl\pem.h>
#include <C:\openssl\include\openssl\x509.h>
#include <C:\openssl\include\openssl\e_os2.h>

int main() {

  const char cert_filestr[] = "./cert-file.pem";
             EVP_PKEY *pkey = NULL;
  BIO              *certbio = NULL;
  BIO               *outbio = NULL;
  X509                *cert = NULL;
  int ret;

  /* ---------------------------------------------------------- *
   * These function calls initialize openssl for correct work.  *
   * ---------------------------------------------------------- */
  OpenSSL_add_all_algorithms();
  ERR_load_BIO_strings();
  ERR_load_crypto_strings();

  /* ---------------------------------------------------------- *
   * Create the Input/Output BIO's.                             *
   * ---------------------------------------------------------- */
  certbio = BIO_new(BIO_s_file());
  outbio  = BIO_new_fp(stdout, BIO_NOCLOSE);

  /* ---------------------------------------------------------- *
   * Load the certificate from file (PEM).                      *
   * ---------------------------------------------------------- */
  ret = BIO_read_filename(certbio, cert_filestr);
  if (! (cert = PEM_read_bio_X509(certbio, NULL, 0, NULL))) {
    BIO_printf(outbio, "Error loading cert into memory\n");
    exit(-1);
  }

  /* ---------------------------------------------------------- *
   * Extract the certificate's public key data.                 *
   * ---------------------------------------------------------- */
  if ((pkey = X509_get_pubkey(cert)) == NULL)
    BIO_printf(outbio, "Error getting public key from certificate");

  /* ---------------------------------------------------------- *
   * Print the public key information and the key in PEM format *
   * ---------------------------------------------------------- */
  /* display the key type and size here */
  if (pkey) {
    switch (pkey->type) {
      case EVP_PKEY_RSA:
        BIO_printf(outbio, "%d bit RSA Key\n\n", EVP_PKEY_bits(pkey));
        break;
      case EVP_PKEY_DSA:
        BIO_printf(outbio, "%d bit DSA Key\n\n", EVP_PKEY_bits(pkey));
        break;
      default:
        BIO_printf(outbio, "%d bit non-RSA/DSA Key\n\n", EVP_PKEY_bits(pkey));
        break;
    }
  }

  if(!PEM_write_bio_PUBKEY(outbio, pkey))
    BIO_printf(outbio, "Error writing public key data in PEM format");

  EVP_PKEY_free(pkey);
  X509_free(cert);
  BIO_free_all(certbio);
  BIO_free_all(outbio);
  exit(0);
}

但是每次我尝试在命令提示符下编译它时都会出现以下错误。因为,我是一个菜鸟,所以我不知道如何从这里开始以及如何解决这个错误。

c:\openssl>gcc -lssl -lcrypto -o test test.c 
In file included from test.c:1:0:
C:\openssl\include\openssl\bio.h:62:27: fatal error: openssl/e_os2.h: No such file or directory
#include <openssl/e_os2.h>
                       ^
compilation terminated.

编辑: 我包含了问题的解决方案,但现在出现了一个新错误:

c:\openssl>gcc -lssl -lcrypto -o test test.c -IC:\openssl\include\
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lssl
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lcrypto
collect2.exe: error: ld returned 1 exit status

【问题讨论】:

  • 似乎-IC:\openssl\include 应该这样做。
  • 你不能链接头文件。
  • 抱歉,我可能使用了错误的术语。

标签: c windows gcc openssl mingw


【解决方案1】:

去掉#include 指令中的完整路径名。即不要使用#include &lt;C:\openssl\include\openssl\bio.h&gt;;而是使用:

#include <openssl\bio.h>
#include <openssl\err.h>
#include <openssl\pem.h>
#include <openssl\x509.h>
#include <openssl\e_os2.h>

并使用-I将包含目录传递给gcc:

gcc -I c:\openssl\include -o myfile myfile.c -lcrypto

【讨论】:

  • @jww 没问题。有道理。
【解决方案2】:

在许多情况下,包含文件又包含其他文件。这些文件的路径是相对的,而不是绝对的。所以你必须告诉你的编译器,通常在哪里搜索包含文件。

-I-选项用于此目的,它告诉编译器要搜索哪些路径(除了一些标准路径)以查找指定的包含文件,在您的情况下,您可以使用:

gcc -I C:\openssl\include

如果你真的需要指定一个绝对包含路径,你会使用引号,而不是&lt;&gt;,即

#include "C:\foo\bar\baz.h"

但如果此文件包含其他文件,编译器将不会专门针对这些文件查找 C:\foo\bar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多