我正在尝试使用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
main.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
将test程序上传到Android设备中后,我无法运行它。相反,我会收到错误消息:/system/bin/sh: ./test: No such file or directory
我在正确的目录下,并且test文件存在,因此我认为无法找到共享库。我已经尝试将libfoo.so上传到Android设备中(上传的路径与编译时指定的路径相同),但仍无法运行程序。
使用静态库(foo.o)可以正常工作:arm-linux-gnueabi-gcc -static -o test main.c foo.o,但无法使用共享库。
如何在交叉编译时正确链接共享库,以确保程序可以在Android设备上运行?
file test
和ldd test
以获取更多详细信息(其中test是您编译的可执行文件)。 - Yeti