Как исправить makefile, чтобы правильно включить -lcrypto, чтобы избежать ошибки компоновщика: неопределенная ссылка на `EVP_CIPHER_CTX_new'

Прежде всего, я пытаюсь использовать

#include <openssl/evp.h>

Я получаю общую ошибку компоновщика:

undefined reference to `EVP_CIPHER_CTX_new'

который, как я знаю, можно решить, используя -lcrypto при компиляции. Я могу сделать это при компиляции вручную, т.е.

g++ encrv2.cpp -o encrv2 -lcrypto 

хотя я пытаюсь создать Makefile и помещаю свои функции шифрования/дешифрования в отдельный файл заголовка (AesGcm) и не могу обойти проблему компоновщика. Ниже мой Makefile на данный момент и вывод, когда я пытаюсь сделать все.

CXX = g++
CXXFLAGS = -std=c++14
LDFLAGS= -lcrypto

all: encrv2

AesGcm.o: AesGcm.cpp AesGcm.h
    $(CXX) $(CXXFLAGS) -c AesGcm.cpp $(LDFLAGS)

encrv2.o: encrv2.cpp AesGcm.h
    $(CXX) $(CXXFLAGS) -c encrv2.cpp $(LDFLAGS)

encrv2: encrv2.o AesGcm.o

clean:
    rm -f *~ *.o encrv2 

Выдает следующую ошибку:

cc -lcrypto  encrv2.o AesGcm.o   -o encrv2
AesGcm.o: In function `AesGcm::encrypt(unsigned char*, int, unsigned char*, int, unsigned char*, unsigned char*, unsigned char*, unsigned char*)':
AesGcm.cpp:(.text+0x3e): undefined reference to `EVP_CIPHER_CTX_new'
AesGcm.cpp:(.text+0x58): undefined reference to `EVP_aes_256_gcm'
AesGcm.cpp:(.text+0x77): undefined reference to `EVP_EncryptInit_ex'
AesGcm.cpp:(.text+0xae): undefined reference to `EVP_EncryptInit_ex'
AesGcm.cpp:(.text+0xe0): undefined reference to `EVP_EncryptUpdate'
AesGcm.cpp:(.text+0x111): undefined reference to `EVP_EncryptUpdate'
AesGcm.cpp:(.text+0x148): undefined reference to `EVP_EncryptFinal_ex'
AesGcm.cpp:(.text+0x17b): undefined reference to `EVP_CIPHER_CTX_ctrl'
AesGcm.cpp:(.text+0x197): undefined reference to `EVP_CIPHER_CTX_free'
AesGcm.o: In function `AesGcm::decrypt(unsigned char*, int, unsigned char*, int, unsigned char*, unsigned char*, unsigned char*, unsigned char*)':
AesGcm.cpp:(.text+0x30a): undefined reference to `EVP_CIPHER_CTX_new'
AesGcm.cpp:(.text+0x324): undefined reference to `EVP_aes_256_gcm'
AesGcm.cpp:(.text+0x343): undefined reference to `EVP_DecryptInit_ex'
AesGcm.cpp:(.text+0x37a): undefined reference to `EVP_DecryptInit_ex'
AesGcm.cpp:(.text+0x3ac): undefined reference to `EVP_DecryptUpdate'
AesGcm.cpp:(.text+0x3dd): undefined reference to `EVP_DecryptUpdate'
AesGcm.cpp:(.text+0x410): undefined reference to `EVP_CIPHER_CTX_ctrl'
AesGcm.cpp:(.text+0x441): undefined reference to `EVP_DecryptFinal_ex'
AesGcm.cpp:(.text+0x450): undefined reference to `EVP_CIPHER_CTX_free'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'encrv2' failed
make: *** [encrv2] Error 1
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
848
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете неправильную переменную.

LDFLAGS предназначены для использования для флагов компоновщика, таких как -L и т. д., которые должны появиться «ранее» в строке ссылки. Эта переменная не предназначена для добавления библиотек в строку ссылок.

Для этого вы должны использовать переменную LDLIBS:

LDLIBS = -lcrypto

Правило по умолчанию для связывания, которое вы используете, поскольку сами его не пишете, выглядит примерно так:

%: %.o
#  recipe to execute (built-in):
        $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@

Обратите внимание, что LDLIBS приходит после к вашим объектным файлам, что вам нужно, чтобы избежать этой ошибки компоновщика. Порядок объектных файлов относительно библиотек и между самими библиотеками очень важен для компоновщика.

На самом деле я не знал, что существует правило по умолчанию для связывания, я смотрел на make-файл OP и спрашивал себя, как он вообще пытается связываться, спасибо: D

Rudolfs Bundulis 08.04.2019 20:04

Другие вопросы по теме