-1

さて、私はこのエラーのさまざまなケースを経験してきましたが、これまでのところ、今回の原因を正確に把握することはできませんでした (私は少し失読症なので、顔を見つめている場合は申し訳ありません) ) 私はこのような問題への参照を見つけ続けています:メインへの未定義の参照 - collect2: ld は 1 の終了ステータス返し、QtCreator ビルドは collect2 を返しました: ld は終了ステータス 1 を返しましたが、これらのタイプのケースは適合しないようです。

編集後にメッセージに自動的に再署名するプログラムを作成しています。署名関数は、いくつかの情報を取り込み、md5 でハッシュ化し (わかっていますが、従来の要件)、出力を Base64 でエンコードします (const unsigned char* を介して一連のバイトと、メッセージの合計サイズを取得します)。

私は最初に MD5 用の Crypto++ ライブラリを試しましたが、将来的には他のハッシュやプロトコルにも拡張できるようになるでしょう。リンク段階で大量の未定義の参照エラーが発生した後、オンラインで見つけた別の md5 実装を試しました。これにより、リンクエラーが2つしか発生しませんが、同じ理由が原因であると思われるため、投稿スペースを節約するために2番目のライブラリを使用します.

メッセージ署名用の C++ コードのスニペット:

string createMessageSignature(string input)
{
    //byte digest[ CryptoPP::MD5::DIGESTSIZE ];

    //CryptoPP::MD5().CalculateDigest( digest, (byte*) input.c_str(), input.length() );

    //cout << "md5 signature: " << digest << endl;

    //string encodedDigest = base64_encode(digest, 32);

    int size = md5(input).length();
    string stringDigest = md5(input);

    const unsigned char* digest = reinterpret_cast<const unsigned char*>(stringDigest.c_str());

    cout << "md5 signature hash: " << digest << endl;

    string encodedDigest = base64_encode(digest, size);

    cout << "signature base64 encoded: " << encodedDigest << endl;

    return encodedDigest;
}

私が現在使用している md5 ライブラリは次のとおりです: http://www.zedwood.com/article/121/cpp-md5-function (ただし、最終的には Crypto++ または OpenSSL に移行したいと考えています)。

リンカからのエラー メッセージ (Win7 で MinGW を使用しますが、Linux 環境の GCC でも発生します):

C:\Users\j********\Desktop\MessageSigner>C:/MinGW/bin/g++ -o MessageSigner.exe M
essageSigner.cpp
C:\Users\J****~1\AppData\Local\Temp\ccLejcEo.o:MessageSigner.cpp:(.text+0xc54):
 undefined reference to `md5(std::string)'
C:\Users\J****~1\AppData\Local\Temp\ccLejcEo.o:MessageSigner.cpp:(.text+0xc9f):
 undefined reference to `md5(std::string)'
collect2: ld returned 1 exit status

何かご意見は?すべてが定義されているように見え、コードがコンパイルされます。リンカのエラーをデバッグした経験はあまりありません。私が使用している唯一のコンパイルオプションは、ファイル名の「-o MessageSigner.exe」の -o です。

-ジミー

4

1 に答える 1

1

使用しているライブラリに対してプログラムをリンクする必要があります。-lmd5 またはライブラリが呼び出されるものを g++ コマンドに追加し、必要に応じてライブラリ パス (オプション -Lpath) を追加します。

ライブラリを使用せず、md5.h と md5.cpp をソース ディレクトリにコピーした場合は、md5.cpp をコンパイラ呼び出しに追加する必要があります。

于 2012-11-16T17:05:18.663 に答える