相关疑难解决方法(0)

在GCC中链接libssl和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)

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

c linker gcc openssl libcrypto

10
推荐指数
1
解决办法
2万
查看次数

引用一堆明显存在的未解决的OpenSSL符号的错误?

我正在构建一个共享库(我们称之为"foo"),它使用另一个库(我们称之为"bar")."bar"使用OpenSSL中的一些函数.

这是问题浮出水面的地方.

"bar"被编译为静态库,看起来OpenSSL也是如此.所以当我链接库("foo")时,我包括:

  • "foo"的目标文件
  • 静态库 libbar.a
  • OpenSSL静态库libcrypto.alibssl.a

build命令看起来像这样:

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符号的链接器错误?

gcc static-linking nm

7
推荐指数
1
解决办法
1352
查看次数

标签 统计

gcc ×2

c ×1

libcrypto ×1

linker ×1

nm ×1

openssl ×1

static-linking ×1