私は、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で参照されている関数シンボルを見つけることができません。
特定の共有オブジェクトまたはディレクトリを手動でポイントする必要がありますか?
ありがとう!
あなたは非常に一般的な初心者の間違いを犯します...あなたが構築するときにあなたがリンクするライブラリをコマンドラインの間違った場所に置くこと。
コマンドラインでは依存関係が逆になっているため、他の何かに依存しているものを実際に配置する必要がありますbeforeコマンドラインに依存しているもの。
あなたの例では、ライブラリのセットに依存するソースファイルmain.cpp
があり、ソースファイルは依存するライブラリの前にある必要があります。
$ g++ -o main main.cpp -lssl -lcrypto
安全のために、コマンドラインにリストされているソースファイルまたはオブジェクトファイルの後に、常にライブラリlastを配置してください。