Openssl for RSA:对RSA_new的未定义引用

时间:2012-08-17 15:45:57

标签: c unix openssl

我今天开始探索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 etc etc

但是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 to dlopen'中   dso_dlfcn.c :(。text + 0x33):对dlsym' dso_dlfcn.c:(.text+0x3d): undefined reference to dlclose'的未定义引用   /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o):在函数dlfcn_bind_func': dso_dlfcn.c:(.text+0x3b1): undefined reference to dlsym'中   dso_dlfcn.c :(。text + 0x490):对dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlfcn_bind_var'的未定义引用:   dso_dlfcn.c :(。text + 0x511):对dlsym' dso_dlfcn.c:(.text+0x5f0): undefined reference to dlerror'的未定义引用   /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o):在函数dlfcn_load': dso_dlfcn.c:(.text+0x667): undefined reference to dlopen'中   dso_dlfcn.c :(。text + 0x6de):对dlclose' dso_dlfcn.c:(.text+0x715): undefined reference to dlerror'的未定义引用   /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o):在函数dlfcn_pathbyaddr': dso_dlfcn.c:(.text+0x7b1): undefined reference to dladdr'中   dso_dlfcn.c :(。text + 0x819):对dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function dlfcn_unload'的未定义引用:   dso_dlfcn.c :(。text + 0x87a):对'dlclose'的未定义引用   collect2:ld返回1退出状态

5 个答案:

答案 0 :(得分:4)

问题在于您正在与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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

您还需要链接到库:

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

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

用您所拥有的内容替换库文件夹和库名称。

答案 3 :(得分:1)

您必须链接 libSSL库。像

这样的东西
gcc -I /usr/local/ssl/include -o myprog myprog.c -lssl

会做到这一点。

(也许它实际上不是-lssl而是-lopenssl-lssl-rsa或其他;您可以通过输入

来找到它
pkg-config --libs PACKAGENAME

其中PACKAGENAME是包含libssl的包的名称,类似于libssl,openssl,libssl-dev,openssl-devel等。)

答案 4 :(得分:0)

如果您使用CMakeLists.txt,则必须添加以下简单命令:

link_libraries(ssl  crypto)