【问题标题】:C - Unable to statically link to OpenSSL on UbuntuC - 无法在 Ubuntu 上静态链接到 OpenSSL
【发布时间】:2013-02-15 23:10:00
【问题描述】:

按照here 给出的说明,我从here 下载了最新版本的 OpenSSL (openssl-1.0.1e.tar.gz) 并将其安装在 Ubuntu v12.10(32 位)上。

我在 Eclipse CDT (v1.2.0.201212170456) 中有一个 C 项目,它静态链接到以下两个 .a 文件:

  • home/usr/local/ssl/lib/libcrypto.a
  • home/usr/local/ssl/lib/libssl.a

但是,当我构建项目时,出现以下错误:

/home/tashimaya/Applications/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: skipping incompatible /usr/local/ssl/lib/libssl.a when searching for -lssl
/home/tashimaya/Applications/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find –lssl

我的工具链是 CodeSourcery (Sourcery G++ Lite 2010q1-202),适用于 32 位操作系统。

我做错了什么?

我正在使用的编译器命令行:

arm-none-linux-gnueabi-gcc -I"/path to my/include" -O0 -g3 -Wall -c -fmessage-length=0 -v -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.c"

【问题讨论】:

  • 您的目标架构是什么?是x86吗?还是ARM?你是交叉编译吗?当你说 Ubuntu 12.10 32 位时,它是 ARM 吗?
  • 我的目标架构是 ARM。我已经在运行在 Windows 7 32 位机器上的 VMware 上安装了 Ubuntu。

标签: c ubuntu openssl arm cross-compiling


【解决方案1】:

您已在 Ubuntu 32 位机器(假设 x86)上安装了 OpenSSL,但正在尝试将其链接到 ARM 二进制文件:

  • /home/tashimaya/Applications/CodeSourcery/bin/../lib/gcc/arm-none-linux-gnueabi: 你的 ARM 工具链
  • /usr/local/ssl/lib/libssl.a:OpenSSL 的 32 位 x86 版本

您必须使用您的 ARM 工具链(即:arm-none-linux-gnueabi-gcc)为 ARM 交叉编译 OpenSSL,然后才能将其链接到 ARM 二进制文件。

【讨论】:

  • 您能告诉我如何使用 arm-none-linux-gnueabi-gcc 构建 OpenSSL 吗?我试过“make CC=arm-none-linux-gnueabi-gcc”,但这似乎不起作用。
  • @jpen:尝试提供编译器的绝对路径。并事先make clean
【解决方案2】:

它说 /usr/local/ssl/lib/libssl.a 不是预期的大小。试试 file 看看你编译的是 32 位还是 64 位版本。并检查您如何编译自己的程序。如果两者都匹配,则链接器 (ld) 将正常链接。

如果你把你的程序编译成 64 位,并把它与 32 位的 libssl.a 链接起来,这是行不通的

示例:

文件 a.out

/* kind ofoutput */ a.out: Mach-O 64-bit executable x86_64

http://unixhelp.ed.ac.uk/CGI/man-cgi?file

【讨论】:

  • 感谢您的建议。运行“/usr/local/ssl/lib$ file libssl.a”会给出此输出“libssl.a: current ar archive”。如何获取有关该文件的更多信息?
  • 奇怪的是在 mac 上输出很好。然后尝试 lipo -info myFile.a,你也会得到架构。
  • 我试过“objdump -f libcrypto.a”。看起来我的 libssl.a 是 32 位的,我的 C 项目也是如此。
  • 你确定它们是同一个架构吗?你能向编译器显示你正在编译你的 c 代码的实际命令吗?
  • 请看我的原帖。我已经用我的编译器命令行更新了它。我试过运行“file main.o”,得到“main.o:ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped”
猜你喜欢
  • 2017-11-25
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多