14

私は、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;

}

ここにあるSHA256()関数を、OpenSSLの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で参照されている関数シンボルを見つけることができません。

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

ありがとう!

4

2 に答える 2

31

あなたは非常によくある初心者の間違いを犯します...ビルド時に、リンクするライブラリをコマンドラインの間違った場所に配置します。

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

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

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

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

于 2012-12-09T03:56:28.880 に答える
-1

これは私のシステムでは問題なく動作しますが、次のことを試してみてください。

extern "C" {
#include <openssl/sha.h>
}

これは、openssl/sha.h 内のすべてのものが「C」関数として宣言されていることを g++ に伝えます。

ところで、あなたの OpenSSL は何歳ですか?

于 2012-12-09T04:00:09.020 に答える