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 to
dlclose' / 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 function
dlfcn_bind_var': dso_dlfcn.с.(:text+0x511): неопределенная ссылка наdlsym' dso_dlfcn.c:(.text+0x5f0): undefined reference to
dlerror' / 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 to
dlerror' / 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 function
dlfcn_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)