【问题标题】:Openssl for RSA: undefined reference to RSA_newRSA 的 Openssl:未定义对 RSA_new 的引用
【发布时间】:2012-08-14 02:07:53
【问题描述】:

我今天开始探索用于 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): 未定义引用dlsym' dso_dlfcn.c:(.text+0x3d): undefined reference todlclose' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o):在函数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): 未定义对“dlclose”的引用 collect2: ld 返回 1 个退出状态

【问题讨论】:

  • 你需要链接ssl的库。我不确定它的名称是什么,但请尝试将 -lssl 添加到编译器命令的末尾。

标签: c unix openssl


【解决方案1】:

问题是您正在与libssl 链接,并且您使用的是libcrypto 的一部分的RSA 加密,另一个错误:没有调用函数: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

【讨论】:

  • 完美。我刚刚在库文件路径的末尾添加了 -L 选项。谢谢大家。
【解决方案2】:

您还需要与库链接:

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

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

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

【讨论】:

    【解决方案3】:

    您必须链接 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 等)

    【讨论】:

    • 我已经尝试过这样做,但还是不行! /usr/local/ssl/lib/pkgconfig 目录包含三个文件:libcrypto.pc、libssl.pc、openssl.pc。我正在编译,但出了点问题。我用编译输出编辑主消息
    • “...做那个” - 做什么?
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      link_libraries(ssl  crypto)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-07
        • 2011-08-07
        • 2017-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        相关资源
        最近更新 更多