【问题标题】:Undefined reference to RSA_generate_key in OpenSSL? [duplicate]OpenSSL 中对 RSA_generate_key 的未定义引用? [复制]
【发布时间】:2017-03-31 16:30:01
【问题描述】:

我在文件rsatest.c 中有以下代码。我正在尝试生成一个 RSA 密钥对。

#include <openssl/rsa.h>
#include <openssl/pem.h>

int main(){
    RSA *rsa = RSA_generate_key((const int) 1024,(const int) 3, 0, 0);
    return 0;
}

我正在编译这个

gcc -I../include/ -L . -lcrypto -lssl rsatest.c

我收到以下错误。

 undefined reference to `RSA_generate_key'

我是否以错误的顺序链接库文件?我在 Windows(64 位)上使用 msys 和 mingw 制作了 libcrypto.a 和 libssl.a,并且我在同一系统上运行代码。

RSA_generate_key 已在 rsa.h 中声明。 libcrypto.a中没有定义吗?

编辑:

我也试过了,

gcc -I../include rsatest.c -L . -lcrypto -lssl

我知道链接器会在库中从左到右查找定义。

但是,我在

中获得了对各种函数的新的未定义引用
rand_win.o and c_zlib.o

我在网上查了一下,发现库 gdi32 和 zlib 中缺少的符号。所以我加了

-lz and -lgdi32

编译器没有抱怨缺少库,所以我假设它们与 mingw 一起存在。而且,我得到了相同的输出。

我也用了nm,发现rand_win.o和c_zlib.o中的符号确实是未定义的。

为什么链接器似乎无法在这些库中找到定义?

【问题讨论】:

  • 使用nm工具验证符号在哪里
  • 你应该使用RSA_generate_key_ex,而不是RSA_generate_key

标签: c windows openssl mingw undefined-reference


【解决方案1】:

更改 gcc 命令中的顺序。

gcc -I../include/ rsatest.c -L . -lcrypto -lssl

据我所知,链接器有一个未定义符号列表。当它处理 libcrypto.a 和 libssl.a 时,未定义符号列表中没有任何内容,因此他只是删除了库。然后在处理 rsatest 后,它的列表中有一些东西,但它不会在已处理的库中查找符号。

【讨论】:

  • @Sashank 现在看起来像这样吗:gcc -I../include/ rsatest.c -L . -lcrypto -lssl -lz -lgdi32?
  • 好吧,我使用了gcc -I../include/ rsatest.c -lz -lgdi32 -L . -lcrypto -lssl,因为 rsatest.c 所在的文件夹中不存在 lz 和 lgdi32。但是您的编辑有效,并且可以编译。我意识到加密从 z 和 gdi 中得到定义,而 -L 在哪里并不重要。所以即使这也有效 gcc -I../include/ rsatest.c -lcrypto -lssl -lz -lgdi32 -L . 。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多