OpenSSL中对RSA_generate_key的未定义引用?

时间:2016-11-17 08:10:58

标签: c windows openssl mingw undefined-reference

我在文件 public static void main( String[] args ) { FileInputStream fileInputStream=null; File file = new File("C:\\testing.txt"); byte[] bFile = new byte[(int) file.length()]; try { //convert file into array of bytes fileInputStream = new FileInputStream(file); fileInputStream.read(bFile); fileInputStream.close(); for (int i = 0; i < bFile.length; i++) { System.out.print((char)bFile[i]); } System.out.println("Done"); }catch(Exception e){ e.printStackTrace(); } } 中有以下代码。我试图生成一个RSA密钥对。

void TableView::mouseDoubleClickEvent ( QMouseEvent *event )
{
    emit(doubleClick(this->indexAt(QPoint(event->pos().x(), event->pos().y()))));
    event->accept();
}

我用

编译了这个
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;
}

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

RSA_generate_key已在rsa.h中声明。它是否未在libcrypto.a中定义?

编辑:

我也试过了,

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

我理解链接器将从左到右查找库中的定义。

但是,我在

中获得了对各种函数的新未定义引用
 undefined reference to `RSA_generate_key'

我在线查找并在库gdi32和zlib中找到了缺少的符号。所以我添加了

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

编译器没有抱怨缺少库,所以我认为它们存在于mingw中。而且,我得到了相同的输出。

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

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

1 个答案:

答案 0 :(得分:2)

更改gcc命令中的顺序。

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

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