Как исправить make-файл, чтобы правильно включить -lcrypto, чтобы избежать ошибки компоновщика: неопределенная ссылка на `EVP_CIPHER_CTX_new ' - PullRequest
0 голосов
/ 08 апреля 2019

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

#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

1 Ответ

2 голосов
/ 08 апреля 2019

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

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

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

LDLIBS = -lcrypto

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...