简体   繁体   English

如何使用MinGW在Windows上使用OpenSSL编译程序

[英]How to compile program with OpenSSL on Windows with MinGW

I tried running this sample code from fm4dd.com. 我尝试从fm4dd.com运行此示例代码。 But I don't know how to actually include the header files into my program. 但是我不知道如何将头文件实际包含到我的程序中。 Orignally it was like: 原本是这样的:

#include <openssl/bio.h>

But i changes it to their actual path, but an error still shows up. 但是我将其更改为实际路径,但仍然显示错误。

#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);
}

but the following error shows up every time I try to compile it on the command prompt. 但是,每次我尝试在命令提示符下进行编译时,都会显示以下错误。 Since, I'm a noob, I have no clue how to proceed from here and what to do to fix this error. 由于我是菜鸟,因此我不知道如何从此处进行操作以及如何解决此错误。

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.

Edit: I included the solution to the problem, but now a new error showed up: 编辑:我包括问题的解决方案,但现在出现了一个新的错误:

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

Get rid of the full path names in your #include directives. 除去#include指令中的完整路径名。 That is, don't use #include <C:\\openssl\\include\\openssl\\bio.h> ; 也就是说,不要使用#include <C:\\openssl\\include\\openssl\\bio.h> rather, use: 而是使用:

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

And pass the include directory to gcc with -I : 并通过-I将include目录传递给gcc:

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

In many cases, include-files in turn include other files. 在许多情况下,包含文件又包含其他文件。 The paths of these files are specified relative, not absolute. 这些文件的路径是相对的,不是绝对的。 So you have to tell your compiler, where to search for include files in general. 因此,您通常必须告诉编译器在哪里搜索包含文件。

The -I -option is for this purpose and tells the compiler, which paths (additionally to some standard paths) are to be searched for specified include files, in your case you would use: -I -option是实现这一目的,并告诉编译器,它的路径(另外一些标准路径)要搜索指定的包含文件,你的情况,你可以使用:

gcc -I C:\openssl\include

If you really need to specify an absolute include path you would use quotes, not <> , ie 如果确实需要指定绝对包含路径,则可以使用引号,而不是<> ,即

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

but if this file includes other files, the compiler will not look specifically into C:\\foo\\bar for these. 但是如果此文件包含其他文件,则编译器将不会专门针对这些文件查找C:\\foo\\bar

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM