【问题标题】:Linking to a shared object library (.so) when cross-compiling交叉编译时链接到共享对象库 (.so)
【发布时间】:2020-04-29 13:50:06
【问题描述】:

我正在尝试使用 ARM 交叉编译器 arm-linux-gnueabi-gcc 将我的 c 程序链接到共享对象库 (libfoo.so)。我正在 Ubuntu 系统上编译,我想在 Android 设备上运行该程序。编译工作正常,但是当我尝试在我的 android 设备上运行程序时出现错误。

我创建了一个包含以下文件的简单测试程序:

foo.c

#include <stdio.h>
void foo(void){ puts("Hello, I am a shared library"); }

foo.h

#ifndef foo_h__
#define foo_h__
extern void foo(void);
#endif

ma​​in.c

#include <stdio.h>
#include "foo.h"
int main(void)
{
    puts("This is a shared library test...");
    foo();
    return 0;
}

然后,我使用以下命令创建了共享对象库:
arm-linux-gnueabi-gcc -c -fPIC foo.c
arm-linux-gnueabi-gcc -shared -o libfoo.so foo.o

然后我使用以下代码编译我的程序:
arm-linux-gnueabi-gcc -L/home/foo -o test main.c -lfoo

使用 adb 将测试程序上传到 Android 设备后,我无法运行它。相反,我得到了错误:
/system/bin/sh: ./test: No such file or directory
我在正确的目录中并且存在测试文件,所以我假设它是找不到的共享库。我也尝试将 libfoo.so 上传到 android 设备(与编译时指定的相同路径),但仍然无法运行程序。

我已经使用 arm-linux-gnueabi-gcc -static -o test main.c foo.o 让它与静态库 (foo.o) 一起工作,但不是共享库。

在交叉编译时如何正确链接共享库,以确保程序随后可以在 Android 设备上运行?

【问题讨论】:

  • 我尝试使用 -fPIC 而不是 -fpic。仍然无法运行./test。我会更新问题以避免混淆。
  • 请务必尝试以下命令:file testldd test 了解更多详细信息(其中 test 是您编译的可执行文件)。

标签: android c linux shared-libraries cross-compiling


【解决方案1】:

链接器无法动态链接到库。

定义 LD_LIBRARY_PATH 环境变量以包含库:

export LD_LIBRARY_PATH=/home/foo

【讨论】:

  • 我尝试在 Ubuntu 系统和 Android 系统上都这样做,但我仍然得到同样的错误。
  • 您确定图书馆的位置正确吗?尝试将其移动到您的 cwd,然后导出 LD_LIBRARY_PATH=./
  • 是的,我确定路径是正确的。我确实尝试将库移动到 cwd 并导出新的 LD_LIBRARY_PATH。仍然没有运气.. 我还尝试将库放在 /vendor/lib 位置,其中有一堆其他 .so 文件。也许错误./test: No such file or directory 指的是别的东西......?我只是看不到它是如何找不到共享库的,除非它完全忽略了 LD_LIBRARY_PATH 的设置。
  • 尝试以不同的顺序编译:arm-linux-gnueabi-gcc main.c -o test -L/home/foo -lfoo
  • 我终于也尝试了,我也遇到了同样的问题!这很奇怪。你设法以某种方式解决它吗?当我从我的 raspi 中编译库时,它工作正常。相同的执行,相同的格式,相同的大小......
猜你喜欢
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2011-12-17
相关资源
最近更新 更多