1

我有一个正在编写的程序,需要计算一些哈希值。我需要 SHA、MD、HMAC 算法。这就是我选择openssl作为解决方案的原因。

我的代码如下:

#include <openssl/md4.h>

void calc();

void calc(unsigned char* data, unsigned long len) {
  unsigned char* h = new unsigned char[128];
  MD4(data, len, h);
}

编译器返回给我以下信息:

myfile.cpp:(.text+0x3e): undefined reference to `MD4' collect2: ld returned 1 exit status

我简单地编译使用:

g++ myfile.cpp -o myapp.o

在 Linux Fedora 下。

我从这里openssl下载了库,并使用然后在下载的解压缩目录中编译了它们。我还在目录中复制了我下载的目录,以便编译器可以找到头文件,因为它在我的环境变量中。./configuremake install/usr/local/includeinclude/usr/local/include$PATH

但是问题是链接器找不到该函数。我知道原因可能有两个:

  • 编译器可以找到头文件但找不到实现。
  • 有问题是因为openssl写在Cnot in 中C++

我应该如何进行?谢谢

编辑1

我实际上改变了我的openssl installation.

openssl再次安装,我可以看到它将所有内容放在/usr/local/ssl我可以找到的目录/usr/local/ssl/include/usr/local/ssl/lib目录下。我将编译字符串更改为:

g++ -I/usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto

在我之前提到的目录中,我可以分别找到/usr/local/ssl/include/openssl包含所有标题的目录/usr/local/ssl/lib/libssl.a/usr/local/ssl/lib/libcrypto.a库。

在我使用旧的编译命令进行此更改之前,编译器告诉我:Cannot find -lssl. 通过这些更改,现在它可以找到库和头文件,但ld总是以同样的方式失败:

myfile.cpp:(.text+0x3e): undefined reference to `MD4' collect2: ld returned 1 exit status

有点失望。你怎么看?

4

2 回答 2

2

链接反对openssl通常需要-lssl.

g++ -o myapp myfile.cpp -lssl 

顺便说一句,听起来您的安装可能有点不正确。

您不必在任何地方复制头文件。而且您可能还没有复制共享库。

编译应该是这样的:

./configure --prefix=/usr/local/openssl
make
make install

然后你编译你的程序,如:

g++ -c -o myapp1.o myfile1.cpp -I/usr/local/openssl/include
g++ -c -o myapp2.o myfile2.cpp -I/usr/local/openssl/include
g++ -o myapp myapp1.o myapp2.o -I/usr/local/openssl/include -L/usr/local/openssl/lib -lssl -lcrypto
于 2012-10-13T14:23:34.953 回答
1

该错误是因为您在编译期间没有将程序链接到 openssl 库。

修复它

g++ myfile.cpp -o myapp.o -lssl

请参阅GCC 中的 OpenSSL 链接选项 -lssl 和 -lcrypto

了解如何将程序链接到 openssl。

于 2012-10-13T14:27:14.137 回答