首页 > 解决方案 > 如何针对静态 OpenSSL 库编译应用程序?

问题描述

我有一个应用程序,我想静态链接到 OpenSSL 库(因为操作系统提供的版本太旧了)。

我已经为这个设备构建了 OpenSSL 库(它是一个旧的 ARM 嵌入式设备),并且链接到.so文件工作正常:

~$ /usr/local/arm-linux/bin/arm-linux-gcc «my own objects» -ldl  -lresolv -lsms -lssl -Wall -o «binary»

现在,我想针对.a文件进行构建,但我似乎没有得到正确的命令。我得到的最好的是:

~$ /usr/local/arm-linux/bin/arm-linux-gcc «my own objects» -ldl  -lresolv -lsms -Wall /usr/local/arm-linux/lib/libssl.a /usr/local/arm-linux/lib/libcrypto.a -o «binary»

但是,这给出了以下未找到的参考:

digest.o(.text+0x48): In function `digest_get_hash':
: undefined reference to `OPENSSL_init_crypto'
digest.o(.text+0x78): In function `digest_get_hash':
: undefined reference to `EVP_MD_CTX_new'
digest.o(.text+0xf4): In function `digest_get_hash':
: undefined reference to `EVP_MD_CTX_free'
ssl.o(.text+0x1c): In function `_ssl_initialise_context':
: undefined reference to `OPENSSL_init_crypto'
ssl.o(.text+0x2c): In function `_ssl_initialise_context':
: undefined reference to `OPENSSL_init_ssl'
ssl.o(.text+0x30): In function `_ssl_initialise_context':
: undefined reference to `TLS_client_method'
ssl.o(.text+0xc0): In function `ssl_init':
: undefined reference to `OPENSSL_init_ssl'
collect2: ld returned 1 exit status

不同的命令,在其中我更改了顺序,或者明显省略libcrypto.alibssl.a产生不同的结果(所有未定义的引用)。

如何静态链接 OpenSSL.a库?

更新当我.a使用解压缩文件ar x «library.a»并链接到生成的.o文件时,构建成功。

更新这是输出gcc -v

[bf@localhost src]$ /usr/local/arm-linux/bin/arm-linux-gcc -v
Reading specs from /usr/local/arm-linux/bin/../lib/gcc-lib/arm-linux/3.3.2/specs
Configured with: ../configure --target=arm-linux --disable-shared --with-headers=/home/gerg/new-wave.xscale/linux-2.4.x/include --with-gnu-as --with-gnu-ld --enable-multilib
Thread model: posix
gcc version 3.3.2

标签: openssllinker

解决方案


如何静态链接 OpenSSL .a 库?

您的库顺序错误:libcrypto.a取决于libssl.a,因此必须libssl.a在链接行之前列出。

有关详细说明,请参阅此帖子


推荐阅读