我一直在尝试使用目录上的“make”命令编译一些文件。但是,我不断收到此错误:
Sammys-MacBook-Pro:p1 AlphaMale$ make
gcc -L/usr/local/lib/ -o kem-enc ske.o rsa.o kem-enc.o prf.o -lcrypto -lssl -lgmp
Undefined symbols for architecture x86_64:
"_EVP_aes_256_ctr", referenced from:
_ske_encrypt in ske.o
_ske_decrypt in ske.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [kem-enc] Error 1
错误消息是(在相关部分中):
Undefined symbols for architecture x86_64:
"_EVP_aes_256_ctr", referenced from:
_ske_encrypt in ske.o
_ske_decrypt in ske.o
告诉你在你正在使用的OpenSSL版本中找不到函数EVP_aes_256_ctr
。您是否尝试过Google搜索,例如'openssl evp_aes_256_ctr'?如果是这样,请说出来。如果没有,请这样做。如果你查看最新的文档(OpenSSL 1.1.0),你可以找到许多EVP_aes_256_
xyz
函数,但EVP_aes_256_ctr()
不是其中之一。
因此,您必须追踪谁认为该功能存在以及他们在哪里找到它。在OpenSSL文档中列出的encryption modes(xyz
值)包括:cbc
,ccm
,cfb
,ecb
,gcm
,ofb
- 而不是ctr
--略微令人惊讶,但显然如此。
您可以检查源是否可用但未记录。从openssl-1.1.0b.tar.gz
的源头看,我可以找到:
./include/openssl/evp.h:780:const EVP_CIPHER *EVP_aes_256_ecb(void);
./include/openssl/evp.h:781:const EVP_CIPHER *EVP_aes_256_cbc(void);
./include/openssl/evp.h:782:const EVP_CIPHER *EVP_aes_256_cfb1(void);
./include/openssl/evp.h:783:const EVP_CIPHER *EVP_aes_256_cfb8(void);
./include/openssl/evp.h:784:const EVP_CIPHER *EVP_aes_256_cfb128(void);
./include/openssl/evp.h:785:# define EVP_aes_256_cfb EVP_aes_256_cfb128
./include/openssl/evp.h:786:const EVP_CIPHER *EVP_aes_256_ofb(void);
./include/openssl/evp.h:787:const EVP_CIPHER *EVP_aes_256_ctr(void);
./include/openssl/evp.h:788:const EVP_CIPHER *EVP_aes_256_ccm(void);
./include/openssl/evp.h:789:const EVP_CIPHER *EVP_aes_256_gcm(void);
./include/openssl/evp.h:790:const EVP_CIPHER *EVP_aes_256_xts(void);
./include/openssl/evp.h:791:const EVP_CIPHER *EVP_aes_256_wrap(void);
./include/openssl/evp.h:792:const EVP_CIPHER *EVP_aes_256_wrap_pad(void);
./include/openssl/evp.h:794:const EVP_CIPHER *EVP_aes_256_ocb(void);
./include/openssl/evp.h:797:const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha1(void);
./include/openssl/evp.h:799:const EVP_CIPHER *EVP_aes_256_cbc_hmac_sha256(void);
注意787行!因此,在某些版本的OpenSSL中,该功能部分已知(我没有发现该功能的实现),但在OpenSSL网站的OpenSSL文档中没有正式记录。话虽如此,跟踪EVP_aes_256_cbc
的来源并非微不足道,因此跟踪EVP_aes_256_ctr
的来源同样繁琐。查看我自己构建的OpenSSL 1.0.2h(需要更新),我发现在库中的目标文件EVP_aes_256_ctr()
中定义了EVP_aes_256_cbc()
和e_aes.o
。在ctr
的来源中提到crypto/evp/e_aes.c
,但确切地说明EVP_aes_256_ctr
如何在目标文件中是......具有挑战性(如:“我还没有弄清楚如何,但是”)。
对我来说,Macports的openssl @ 1.0.2r_0(-I /opt/local/include/
)和openssl 0.9.x(-L /usr/lib
)的系统库之间的标题不匹配导致:
Undefined symbols for architecture x86_64:
"_EVP_aes_256_ctr", referenced from:
_libssh2_crypt_method_aes256_ctr in liblibssh2_sys-8dfe6494e5de1ded.rlib(crypt.o)
"_EVP_aes_192_ctr", referenced from:
_libssh2_crypt_method_aes192_ctr in liblibssh2_sys-8dfe6494e5de1ded.rlib(crypt.o)
"_EVP_aes_128_ctr", referenced from:
_libssh2_crypt_method_aes128_ctr in liblibssh2_sys-8dfe6494e5de1ded.rlib(crypt.o)
ld: symbol(s) not found for architecture x86_64