c++ - 如何修复 makefile 以正确包含 -lcrypto 以避免链接器错误 : undefined reference to `EVP_CIPHER_CTX_new'

标签 c++ makefile openssl

首先我尝试使用

#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

最佳答案

您使用了错误的变量。

LDFLAGS 旨在用于链接器标志,例如 -L 等需要在链接行中“更早”出现的标志。该变量不打算将库添加到链接行。

您应该为此使用 LDLIBS 变量:

LDLIBS = -lcrypto

链接的默认规则,这是你正在使用的,因为你没有自己写一个,看起来像这样:

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

请注意,LDLIBS 位于目标文件之后,这是避免此链接器错误所需要的。目标文件与库的顺序,以及库本身之间的顺序,对于链接器来说非常重要。

关于c++ - 如何修复 makefile 以正确包含 -lcrypto 以避免链接器错误 : undefined reference to `EVP_CIPHER_CTX_new' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55579144/

相关文章:

c++ - 如何使用Opus编码和解码音频数据?

c++ - asio 周期性定时器

c++ - 编译文件告诉makefile如何编译

运行 make CentOS 时出现 OpenCV 错误

OpenSSL 加密/解密字符串

openssl - 使用 openssl 将 pfx 转换为 pem

c++ - 在 C++ 中实现增量数组

c++ - 设置 makefile 以使用 emacs flymake 检查 c 和 c++ 源文件

ruby - 使用 Ruby OpenSSL 验证非散列数据的签名

c++ - Visual Studio C++ 在使用模板时将奇怪的字符输出到控制台