9

我今天开始探索 RSA 的 openSSL api。这是简单的代码:

#include<stdio.h>
#include<openssl/rsa.h>
#include<openssl/engine.h>
int main() {
    RSA *rsa;
    rsa = RSA_new_();
    RSA_free(rsa);
    return 0;
}

我正在编译

gcc -I /usr/local/ssl/include -o 等等

但 gcc 返回未定义对 RSA_new 和 RSA_free 的引用的错误。我检查了 rsa.h 标头,并没有引用这两个函数。怎么了?我已经按照openssl网站上的参考指南...

编辑: gcc 输出:

gcc -I /usr/local/ssl/include/ -o rsa rsa.c -L/usr/local/ssl/lib -lcrypto /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o):在函数中dlfcn_globallookup': dso_dlfcn.c:(.text+0x1d): undefined reference todlopen' dso_dlfcn.c:(.text+0x33): undefined reference to dlsym' dso_dlfcn.c:(.text+0x3d): undefined reference todlclose' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlfcn_bind_func': dso_dlfcn.c:(.text+0x3b1): undefined reference todlsym' dso_dlfcn.c:(.text+0x490) : 对dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In functiondlfcn_bind_var' 的未定义引用:dso_dlfcn.c:(.text+0x511): 对dlsym' dso_dlfcn.c:(.text+0x5f0): undefined reference todlerror'/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o) 的未定义引用:在函数dlfcn_load': dso_dlfcn.c:(.text+0x667): undefined reference todlopen' dso_dlfcn.c:( .text+0x6de): 对dlclose' dso_dlfcn.c:(.text+0x715): undefined reference todlerror 的未定义引用'/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): 在函数dlfcn_pathbyaddr': dso_dlfcn.c:(.text+0x7b1): undefined reference todladdr' dso_dlfcn.c:(.text+0x819): 未定义的引用dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In functiondlfcn_unload': dso_dlfcn.c:(.text+0x87a): undefined reference to `dlclose' collect2: ld 返回 1 exit status

4

5 回答 5

5

问题是您正在链接libssl并且您正在使用 RSA 加密,这是libcrypto另一个错误的一部分:没有调用函数RSA_new_::

toc@UnixServer:/usr/include/openssl$ grep RSA_new *
rsa.h:RSA * RSA_new(void);
rsa.h:RSA * RSA_new_method(ENGINE *engine);

所以更正你的代码:

rsa = RSA_new();

并像这样编译:

gcc -I/usr/include/openssl/ -Wall my_rsa.c -o my_rsa  -lcrypto

编辑:对于最后一个错误(dl 函数):

gcc -I/usr/include/openssl/ -Wall my_rsa.c -o my_rsa  -lcrypto -ldl
于 2012-08-17T16:17:11.800 回答
3

您还需要与库链接:

gcc -I/usr/local/ssl/include -o etc etc.c -L/usr/local/lib -lssl

-L选项告诉 GCC 在哪里寻找库文件,并且-l(small L) 告诉链接器它应该与库链接。

用你得到的替换库文件夹和库名称。

于 2012-08-17T15:49:35.847 回答
2

您必须链接到 libSSL 库。就像是

gcc -I /usr/local/ssl/include -o myprog myprog.c -lssl

会成功的。

(也许实际上不是-lsslbut -lopenssl-lssl-rsa或其他什么;您可以通过键入

pkg-config --libs PACKAGENAME

其中 PACKAGENAME 是包含 libssl 的包的名称,例如 libssl、openssl、libssl-dev、openssl-devel 等)

于 2012-08-17T15:48:54.173 回答
2

您需要添加-lssl或类似的东西。“未定义的引用”由链接器生成,它正在寻找RSA_newand的实际实现RSA_free。这些函数位于 openssl 库中的某个位置,-lssl您可以让链接器知道它们在哪里。

编辑:如果头文件有问题,您会看到类似“标识符 RSA_new 的隐式声明”之类的错误。但是您需要启用某些标志才能出现这种错误(我认为-Wmissing-prototypes)。

于 2012-08-17T15:49:26.297 回答
0

如果你使用 CMakeLists.txt,你必须添加这个简单的命令:

link_libraries(ssl  crypto)
于 2017-04-14T09:36:53.743 回答