2016-07-26 37 views
3

私はC++ Builder 10 Seattleでアプリケーションをコンパイルしていて、OpenSSL for RSAを使用しようとしています。C++ BuilderでOpenSSLを使用する

[ilink32 Error] Error: 'C:\USERS\ERICWANG\DESKTOP\TESTOPENSSL2\LIB\LIBEAY32.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

:、私はエラーメッセージが表示されました

#include <stdio.h> 
#include <openssl/rsa.h> 
#include <openssl/pem.h> 

bool generate_key() 
{ 
    int    ret = 0; 
    RSA    *r = NULL; 
    BIGNUM   *bne = NULL; 
    BIO    *bp_public = NULL, *bp_private = NULL; 

    int    bits = 2048; 
    unsigned long e = RSA_F4; 

    // 1. generate rsa key 
    bne = BN_new(); 
    ret = BN_set_word(bne,e); 
    if(ret != 1){ 
     goto free_all; 
    } 

    r = RSA_new(); 
    ret = RSA_generate_key_ex(r, bits, bne, NULL); 
    if(ret != 1){ 
     goto free_all; 
    } 

    // 2. save public key 
    bp_public = BIO_new_file("public.pem", "w+"); 
    ret = PEM_write_bio_RSAPublicKey(bp_public, r); 
    if(ret != 1){ 
     goto free_all; 
    } 

    // 3. save private key 
    bp_private = BIO_new_file("private.pem", "w+"); 
    ret = PEM_write_bio_RSAPrivateKey(bp_private, r, NULL, NULL, 0, NULL, NULL); 

    // 4. free 
    free_all: 

    BIO_free_all(bp_public); 
    BIO_free_all(bp_private); 
    RSA_free(r); 
    BN_free(bne); 

    return (ret == 1); 
} 

int main(int argc, char* argv[]) 
{ 
    generate_key(); 
    return 0; 
} 

私は私のプロジェクトにlibeay32.libssleay32.libを追加しました:

ここHow to Use OpenSSL to Generate RSA Keys in C/C++

コードです:

私はこのチュートリアルに従っ

私はいくつかのヒントを見ましたcoff2omfimplibツールを使用していましたが、どちらも機能しませんでした。

  1. 私は、libeay32.libを変換するためにcoff2omf.exeを使用しました。私は、同じフォルダにcoff2omf.exelibeay32.libを入れて、このコマンドを入力する:

    coff2omf libeay32.lib Blibeay32.lib 
    

    それは言った:

    ERROR: COFF error: libeay32.lib : invalid machine type detected

  2. 私はimplib.exeを使用して.dllファイルにlibeay32.libを変換しようとしました。私は、このコマンドを入力する:

    implib libeay32.lib Blibeay32.dll 
    

    それは言った:

    Error : unable to open file

    そして、私のlibeay32.libは、1キロバイトのファイルにそのサイズを変更します。つまり、ファイルが間違っていたことを意味します。

+1

** XE10 **はありません。 ** 10.0シアトル**、** 10.1ベルリン**など –

答えて

5

OpenSSLはC++ Builderでうまく動作します。私は自分のC++ Builderアプリで使っています。

プリコンパイル済みのOpenSSL DLLに含まれている.libファイルは使用できません。それらの.libファイルはVisual Studio用です。

C++ Builderでは、C++ Builderのimplibまたはmkexpコマンドラインユーティリティを使用して、DLLからC++ Builder互換のインポートライブラリを作成する必要があります。 32ビットDLLの場合はimplib、64ビットDLLの場合はmkexpを使用してください。

新しいOpenSSLバージョンがリリースされてから、このテクニックを何年も使っています。

implibコマンドが間違っています。 "libeay32.lib.dllファイル"に変換することはできません。第1のパラメータは出力パラメータであり、第2のパラメータは入力パラメータである。 DLLのファイルを.libに作成する必要があります。ファイル「を開くことができません」が表示される理由は、ファイルがBlibeay32.dllではありません。Bをドロップし、正しいDLLファイル名を使用します。

implib libeay32.lib libeay32.dll 
implib ssleay32.lib ssleay32.dll 

mkexp libeay32.a libeay32.dll 
mkexp ssleay32.a ssleay32.dll 

これは、それぞれlibeay32.dllssleay32.dll、から関数をインポートするための参照を含む.lib.aファイルを作成します。

+0

お返事ありがとうございます。 – kim

+0

私はOpenSSL-Win64 \ bin \ libeay32.dllを使って.libに変換します。 しかし、私は "implib libeay32.lib libeay32.dll"を使用します。 エラーメッセージはありません.1KBサイズのlibeay32.libファイルも作成されます。 まだ間違っています。 – kim

+0

['implib.exe'](http://docwiki.embarcadero.com/RADStudio/en/IMPLIB.EXE,_the_Import_Library_Tool_for_Win32)は、32ビットDLLの場合のみです。 64ビットDLLの場合、代わりに['mkexp.exe'](http://docwiki.embarcadero.com/RADStudio/en/MKEXP.EXE,_the_64-bit_Windows_Import_Library_Tool_for_C%2B%2B)を使う必要があります。 –

関連する問題