2016-11-17 136 views
2

我在文件rsatest.c中有以下代码。我正在尝试生成一个RSA密钥对。未定义的OpenSSL中的RSA_generate_key引用?

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

我按照错误的顺序链接库文件?我使用msys和mingw在Windows(64位)上创建了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中的符号确实没有定义。

为什么连接器似乎不能在这些库中找到定义?

+0

使用'nm'工具来验证符号的位置 –

+0

您应该使用['RSA_generate_key_ex'](http://www.openssl.org/docs/man1.0.2/crypto/RSA_generate_key_ex.html),而不是' RSA_generate_key'。 – jww

回答

2

改变你的gcc命令的顺序。

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

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

+0

@Sashank现在看起来像这样:'gcc -I ../ include/rsatest.c -L。 -lcrypto -lssl -lz -lgdi32'? –

+0

那么我用'gcc -I ../ include/rsatest.c -lz -lgdi32 -L。 -lcrypto -lssl',因为lz和lgdi32不在rsatest.c所在的文件夹中。但是你的编辑工作,并编译。我意识到加密从z和gdi获得它的定义,并且-L在哪里并不重要。所以即使这个工作'gcc -I ../ include/rsatest.c -lcrypto -lssl -lz -lgdi32 -L ..'。谢谢! – Sashank