在GCC中链接libssl和libcrypto

And*_*ndy 10 c linker gcc openssl libcrypto

我正在尝试使用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)

我有点难过.如果有人想让我觉得自己像个傻瓜,我会非常兴奋地弄清楚我做错了什么!

And*_*ndy 14

事实证明这是一个愚蠢的事情.在链接器步骤中,我正在使用gcc -Wall -g -lssl -lcrypto -o program program.o.我所需要的目标文件,我链接后到图书馆链接移动到,并把libssl之前libcrypto:

gcc -Wall -g -o program program.o -lssl -lcrypto
Run Code Online (Sandbox Code Playgroud)

  • 是的,订单和位置在链接时很重要.`-l`选项应该出现在编译器驱动程序(GCC)命令的末尾.库的顺序也很重要,因为`ld`是单通道链接器.所以`-lssl -lcrypto`有效,但`-lcrypto -lssl`不起作用.你会得到链接器错误,因为`ld`在访问`libssl`时需要访问`libcrypto`(`libssl`需要来自`libcrypto`的东西). (4认同)