私は、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で参照されている関数シンボルを見つけることができません。
特定の共有オブジェクトまたはディレクトリを手動でポイントする必要がありますか?
ありがとう!