我正在尝试使用OpenSSL的EVP接口进行一些加密.我很确定我的代码是正确的,但我似乎无法编译.我正在使用GCC,并且安装了libssl-dev的Ubuntu 32位精确版和最新版本.
该项目目前包含一个文件program.c.
#include <openssl/evp.h>
...
i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1() ... );
...
EVP_CIPHER_CTX_init(e_ctx);
Run Code Online (Sandbox Code Playgroud)
以及其他各种电话.
这是我如何调用gcc:
gcc -Wall -g -lssl -lcrypto -o program program.c
Run Code Online (Sandbox Code Playgroud)
然后我得到这样的输出
/home/andy/program/program.c:31: undefined reference to `EVP_sha1'
/home/andy/program/program.c:31: undefined reference to `EVP_aes_256_cbc'
/home/andy/program/program.c:31: undefined reference to `EVP_BytesToKey'
/home/andy/program/program.c:44: undefined reference to `EVP_CIPHER_CTX_init'
Run Code Online (Sandbox Code Playgroud)
所以包含显然在起作用:
andy@ProgStation2:/usr/include$ find . | grep evp.h
./openssl/evp.h
Run Code Online (Sandbox Code Playgroud)
这是输出locate libcrypto.我最好的猜测是,这是一个愚蠢的位置,这就是为什么我的链接失败,所以我-L/usr/lib/i386-linux-gnu之前尝试过-lcrypto没有运气.
/lib/i386-linux-gnu/libcrypto.so.1.0.0
Run Code Online (Sandbox Code Playgroud)
我有点难过.如果有人想让我觉得自己像个傻瓜,我会非常兴奋地弄清楚我做错了什么!
我正在构建一个共享库(我们称之为"foo"),它使用另一个库(我们称之为"bar")."bar"使用OpenSSL中的一些函数.
这是问题浮出水面的地方.
"bar"被编译为静态库,看起来OpenSSL也是如此.所以当我链接库("foo")时,我包括:
libbar.alibcrypto.a和libssl.abuild命令看起来像这样:
g++ -Wl,-soname,libfoo.so -shared file1.o file2.o libbar.a \
libcrypto.a libssl.a -o libfoo.so
Run Code Online (Sandbox Code Playgroud)
但是,我收到了很多错误:
ld: ./obj/libbar.a(file1.c.o): in function initialize_openssl:
ssl.c:117: error: undefined reference to 'SSL_library_init'
Run Code Online (Sandbox Code Playgroud)
运行以下命令:
nm libssl.a | grep SSL_library_init
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
00000000 T SSL_library_init
Run Code Online (Sandbox Code Playgroud)
显然,OpenSSL库没有任何问题.什么可能导致这样的事情?以下是用于构建OpenSSL的三个命令:
export cross=arm-linux-androideabi-
./Configure android --prefix=~/openssl-arm
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
Run Code Online (Sandbox Code Playgroud)
编译过程完成没有任何错误,所以我完全感到困惑.
为什么我会收到引用明显存在的一堆OpenSSL符号的链接器错误?