Вопрос по openssl, windows, undefined-reference, c, mingw – Неопределенная ссылка на RSA_generate_key в OpenSSL? [Дубликат]

2

На этот вопрос уже есть ответ здесь:

Связывание libssl и libcryp#o в GCC [дубликат] 2 ответа

У меня есть следующий код в файлеrsa#es#.c, Я пытаюсь сгенерировать пару ключей RSA.

#include &l#;openssl/rsa.h&g#;
#include &l#;openssl/pem.h&g#;

in# main(){
    RSA *rsa = RSA_genera#e_key((cons# in#) 1024,(cons# in#) 3, 0, 0);
    re#urn 0;
}

Я собираю это с

gcc -I../include/ -L . -lcryp#o -lssl rsa#es#.c

и я получаю следующую ошибку.

 undefined reference #o `RSA_genera#e_key'

Связываю ли я файлы библиотеки в неправильном порядке? Я сделал libcryp#o.a и libssl.a для Windows (64-битная версия) с msys и mingw, и я запускаю код в той же системе.

RSA_genera#e_key был объявлен в rsa.h. Разве это не определено в libcryp#o.a?

РЕДАКТИРОВАТЬ :

Я тоже это попробовал,

gcc -I../include rsa#es#.c -L . -lcryp#o -lssl

и я понимаю, что компоновщик будет искать определения в библиотеках, идущих слева направо.

Тем не менее, я получаю новые неопределенные ссылки на различные функции в

rand_win.o and c_zlib.o

Я посмотрел онлайн и нашел недостающие символы в библиотеках gdi32 и zlib. Итак, я добавил

-lz and -lgdi32

Компилятор не жаловался на отсутствующую библиотеку, поэтому я предполагаю, что они присутствуют в mingw. И все же я получаю такой же вывод.

Я также использовал nm и обнаружил, что символы действительно не определены в rand_win.o и c_zlib.o.

Почему компоновщик не может найти определения в этих библиотеках?

Вы должны использоватьRSA_generate_key_exнеRSA_generate_key. jww
использованиеnm инструмент для проверки, где находится символ Michał Walenciak

Ваш Ответ

1   ответ
2

Измените порядок в вашей команде gcc.

gcc -I../include/ rsatest.c -L . -lcrypto -lssl

Насколько я знаю, компоновщик имеет список неопределенных символов. Когда он обрабатывает libcrypto.a и libssl.a, в списке неопределенных символов ничего нет, поэтому он просто удаляет библиотеки. Затем после обработки rsatest у него есть что-то в списке, но он не ищет символы в уже обработанных библиотеках.

Ну я использовалgcc -I../include/ rsatest.c -lz -lgdi32 -L . -lcrypto -lsslпотому что lz и lgdi32 не присутствовали в папке, где был rsatest.c. Но ваше редактирование работает, и оно компилируется. И я понял, что crypto получает свои определения от z и gdi, и не имеет значения, где находится -L. Так что даже это работаетgcc -I../include/ rsatest.c -lcrypto -lssl -lz -lgdi32 -L . , Спасибо! Sashank
@Sashank теперь выглядит так:gcc -I../include/ rsatest.c -L . -lcrypto -lssl -lz -lgdi32? Marek Klein

Похожие вопросы