Неопределенная ссылка на RSA_generate_key в OpenSSL? [Дубликат]

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

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

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

#include <openssl/rsa.h>
#include <openssl/pem.h>

int main(){
    RSA *rsa = RSA_generate_key((const int) 1024,(const int) 3, 0, 0);
    return 0;
}

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

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

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

 undefined reference to `RSA_generate_key'

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

RSA_generate_key объявлен в rsa.h. Разве это не определено в libcrypto.a?

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

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

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

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

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

rand_win.o and c_zlib.o

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

-lz and -lgdi32

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

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

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

 Michał Walenciak17 нояб. 2016 г., 09:13
usenm инструмент, чтобы проверить, где символ
 jww17 нояб. 2016 г., 12:11
Ты должен использоватьRSA_generate_key_ex, неRSA_generate_key.

Ответы на вопрос(1)

Решение Вопроса

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

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

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

 Marek Klein17 нояб. 2016 г., 10:53
@ Sashank теперь выглядит так:gcc -I../include/ rsatest.c -L . -lcrypto -lssl -lz -lgdi32?
 Sashank17 нояб. 2016 г., 11:19
Ну, я использовал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 .. Благодарность

Ваш ответ на вопрос