C++ 如何使用OpenSSL';s SHA256函数

C++ 如何使用OpenSSL';s SHA256函数,c++,gcc,openssl,sha256,C++,Gcc,Openssl,Sha256,我正在编写一个程序来熟悉OpenSSL、libncurses和UDP网络。我决定使用OpenSSL的SHA256来熟悉行业加密标准,但在使其正常工作方面遇到了问题。我已经隔离了OpenSSL与编译程序链接的错误。我正在开发Ubuntu 12.10,64位。我已经安装了libssl-dev包 例如,C++主文件。CPP:< /P> #include <iostream> #include <sstream> #include <string> #include

我正在编写一个程序来熟悉OpenSSL、libncurses和UDP网络。我决定使用OpenSSL的SHA256来熟悉行业加密标准,但在使其正常工作方面遇到了问题。我已经隔离了OpenSSL与编译程序链接的错误。我正在开发Ubuntu 12.10,64位。我已经安装了libssl-dev包

例如,C++主文件。CPP:< /P>

#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;

}
因此,GCC清楚地识别OpenSSL定义的函数和类型,但ld无法找到sha.h中提到的函数符号

我是否需要手动指向特定的共享对象或目录


谢谢

你犯了一个非常常见的初学者错误。。。生成时,将链接的库放在命令行的错误位置

依赖关系在命令行上是反向的,因此依赖于其他内容的内容实际上应该放在依赖于命令行的内容之前

在您的示例中,您有一个源文件
main.cpp
,它依赖于一组库,那么源文件应该位于它所依赖的库之前:

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

为了安全起见,请始终将库放在最后,在命令行上列出的任何源文件或对象文件之后。

这在我的系统上运行良好,但您可以尝试:

extern "C" {
#include <openssl/sha.h>
}
extern“C”{
#包括
}
这告诉g++openssl/sha.h中的所有内容都声明为“C”函数


顺便说一句,你的OpenSSL有多老了?

天哪,它成功了!谢谢我用GCC做一些小事情已经有7年了,但我从来没有意识到命令行参数是这样工作的。很少有Unix程序要求您在参数后放置选项,在我看来,一般来说这是一种糟糕的做法。@jcomeau_ictx:Huh?不,这还不够。它应该查找引用这些库中的符号的源文件。i、 e.“在
main.cpp
已经足够了之后”。我试过了,使用上面的GCC参数,仍然收到了相同的错误。约阿希姆的建议解决了这个问题。我正在使用OpenSSL版本1.0.1c作为记录。
extern "C" {
#include <openssl/sha.h>
}