web-dev-qa-db-ja.com

OpenSSLのSHA256関数の使用方法

私は、OpenSSL、libncurses、およびUDPネットワーキングに精通するためのプログラムを書いています。 OpenSSLのSHA256を使用して業界の暗号化標準に精通することにしましたが、それを機能させるのに問題があります。 OpenSSLとコンパイル済みプログラムのリンクにエラーを切り分けました。私はUbuntu12.10、64ビットに取り組んでいます。 libssl-devパッケージをインストールしています。

たとえば、C++ main.cppを考えてみましょう。

#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
using namespace std;

#include <openssl/sha.h>

string sha256(const string str)
{
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, str.c_str(), str.size());
    SHA256_Final(hash, &sha256);
    stringstream ss;
    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
    {
        ss << hex << setw(2) << setfill('0') << (int)hash[i];
    }
    return ss.str();
}

int main()
{

    cout << sha256("test") << endl;
    cout << sha256("test2") << endl;

    return 0;

}

OpenSSLのSHA256機能のラッパーとして ここ で見つかったSHA256()関数を使用しています。

次のg ++​​引数を使用してコンパイルしようとすると、次のエラーが発生します。

millinon@myhost:~/Programming/sha256$ g++ -lssl -lcrypto -o main main.cpp
/tmp/ccYqwPUC.o: In function `sha256(std::string)':
main.cpp:(.text+0x38): undefined reference to `SHA256_Init'
main.cpp:(.text+0x71): undefined reference to `SHA256_Update'
main.cpp:(.text+0x87): undefined reference to `SHA256_Final'
collect2: error: ld returned 1 exit status

そのため、GCCはOpenSSLで定義された関数とタイプを明確に認識しますが、ldはsha.hで参照されている関数シンボルを見つけることができません。

特定の共有オブジェクトまたはディレクトリを手動でポイントする必要がありますか?

ありがとう!

12
millinon

あなたは非常に一般的な初心者の間違いを犯します...あなたが構築するときにあなたがリンクするライブラリをコマンドラインの間違った場所に置くこと。

コマンドラインでは依存関係が逆になっているため、他の何かに依存しているものを実際に配置する必要がありますbeforeコマンドラインに依存しているもの。

あなたの例では、ライブラリのセットに依存するソースファイルmain.cppがあり、ソースファイルは依存するライブラリの前にある必要があります。

$ g++ -o main main.cpp -lssl -lcrypto

安全のために、コマンドラインにリストされているソースファイルまたはオブジェクトファイルの後に、常にライブラリlastを配置してください。

27