Openssl для RSA: неопределенная ссылка на RSA new

сегодня я начал изучать OpenSSL api для RSA. Это простой код:

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

и я компилирую с

ССЗ -я /usr/местные/протокол SSL/включить-O и т. д. и т. п.

но gcc возвращает ошибку неопределенной ссылки на RSA_new и RSA_free. Я проверил rsa.H заголовок, и нет ссылки на эту функцию. что случилось? Я следую справочному руководству на веб-сайте openssl...

изменить: ССЗ вывод:

ССЗ -я /usr/местные/протокол SSL/включают в себя/ -о ОГА ОГА.c-L / usr / локальный / ssl / lib-lcrypto / usr / local / ssl/lib / libcrypto.a (dso_dlfcn.о): в функции dlfcn_globallookup': dso_dlfcn.c:(.text+0x1d): undefined reference toфункции выглядит' dso_dlfcn.с.(:text+0x33): неопределенная ссылка на dlsym' dso_dlfcn.c:(.text+0x3d): undefined reference todlclose' / usr / local / ssl/lib / libcrypto.a (dso_dlfcn.о): в функции dlfcn_bind_func': dso_dlfcn.c:(.text+0x3b1): undefined reference toфункция dlsym' dso_dlfcn.с.(:text+0x490): неопределенная ссылка на dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In functiondlfcn_bind_var': dso_dlfcn.с.(:text+0x511): неопределенная ссылка на dlsym' dso_dlfcn.c:(.text+0x5f0): undefined reference todlerror' / usr / local / ssl/lib / libcrypto.a (dso_dlfcn.о): в функции dlfcn_load': dso_dlfcn.c:(.text+0x667): undefined reference toфункции выглядит' dso_dlfcn.с.(:text+0x6de): неопределенная ссылка на dlclose' dso_dlfcn.c:(.text+0x715): undefined reference todlerror' / usr / local / ssl/lib / libcrypto.a (dso_dlfcn.о): в функции dlfcn_pathbyaddr': dso_dlfcn.c:(.text+0x7b1): undefined reference toфункция dladdr' dso_dlfcn.с.(:text+0x819): неопределенная ссылка на dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In functiondlfcn_unload': dso_dlfcn.с.(:text+0x87a): неопределенная ссылка на 'dlclose' collect2: LD вернул 1 статус выхода

5 ответов


propblem заключается в том, что вы связываетесь с libssl и вы используете RSA crypto, который является частью 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

EDIT : для последней ошибки (функции dl):

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

вам нужно добавить -lssl или что-то подобное. 'Неопределенная ссылка генерируется компоновщиком, который ищет фактическую реализацию RSA_new и RSA_free. Эти функции находятся где-то в библиотеке OpenSSL, и с -lssl вы сообщите компоновщику, где они находятся.

EDIT: если что-то не так с заголовочным файлом, вы увидите ошибку, например "неявное объявление идентификатора RSA_new". Но вам нужно включить определенные флаги, чтобы иметь такого рода ошибки (я думал -Wmissing-prototypes).


вам также необходимо связаться с библиотекой:

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

на -L опция сообщает GCC, где искать файл библиотеки, и -l (маленький L) сообщает компоновщику, что он должен связаться с библиотекой.

замените папку библиотеки и имя библиотеки тем, что у вас есть.


вы должны С библиотека 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 и т. д.)


Если вы используете CMakeLists.txt, вы должны добавить эту простую команду:

link_libraries(ssl  crypto)