未定义对 OpenSSL 中RSA_generate_key的引用?[复制]

Undefined reference to RSA_generate_key in OpenSSL? [duplicate]

提问人:Sashank 提问时间:11/17/2016 最后编辑:jwwSashank 更新时间:11/17/2016 访问量:3282

问:

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

#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 中的符号确实没有定义。

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

c windows openssl mingw undefined-reference

评论

0赞 Michał Walenciak 11/17/2016
使用工具验证符号的位置nm
0赞 jww 11/17/2016
您应该使用 RSA_generate_key_ex,而不是 .RSA_generate_key

答:

2赞 Marek Klein 11/17/2016 #1

更改 gcc 命令中的顺序。

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

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

评论

0赞 Marek Klein 11/17/2016
@Sashank现在看起来像这样:?gcc -I../include/ rsatest.c -L . -lcrypto -lssl -lz -lgdi32
0赞 Sashank 11/17/2016
好吧,我使用了 ,因为 lz 和 lgdi32 不在 rsatest.c 所在的文件夹中。但是您的编辑可以工作,并且可以编译。我意识到加密货币的定义来自 z 和 gdi,而 -L 在哪里并不重要。所以即使这样也有效.谢谢!gcc -I../include/ rsatest.c -lz -lgdi32 -L . -lcrypto -lsslgcc -I../include/ rsatest.c -lcrypto -lssl -lz -lgdi32 -L .