使用动态库交叉编译C代码时出错

我有两个文件:

lib.c

#include void hi() { printf("Hi i'm a library function in lib.so\n"); } 

和main.c

 #include #include /* based on Jeff Scudder's code */ int main() { void *SharedObjectFile; void (*hi)(); // Load the shared libary; SharedObjectFile = dlopen("./lib.so", RTLD_LAZY); // Obtain the address of a function in the shared library. ciao = dlsym(SharedObjectFile, "hi"); // Use the dynamically loaded function. (*hi)(); dlclose(SharedObjectFile); } 

我尝试使用以下命令构建可执行文件:

export LD_LIBRARY_PATH = pwd

gcc -c -fpic lib.c

gcc -shared -lc -o lib.so lib.o

gcc main.c -ldl

而且效果很好。 然后我尝试使用以下命令在Android(Nexus One,ARM-v7-0a arch)上导出我的程序:

export LD_LIBRARY_PATH = pwd

arm-none-linux-gnueabi-gcc -c -fpic lib.c

arm-none-linux-gnueabi-gcc -shared -lc -o lib.so lib.o

arm-none-linux-gnueabi-gcc main.c -ldl -o main

adb push main / system / app

在智能手机上正确的文件夹上执行./main的结果就是:

./main:找不到

即使我的文件就在那里!

我在交叉编译过程中遗漏了什么吗? 有帮助吗? 我正在使用CodeSourcery中的交叉编译器,它适用于没有.so库的静态程序。 谢谢

编辑 :正如Igor在下面所述,这是一个链接器问题。 此命令修复它:

arm-none-linux-gnueabi-gcc -o test main.c -Wl, – dynamic-linker = / system / bin / linker -ldl

在我的情况下,我需要其他库,因为在/ system / lib /中没有很多.so文件。

“未找到”消息不是指共享对象,而是指动态链接器。 Linux使用/lib/ld-linux.so.2 (或/lib64/ld-linux-x86-64.so.2代表x64),而Android使用/bin/linker 。 您可以使用readelf -l检查程序使用哪个动态加载程序,例如:

 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 RE 0x4 INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.2] 

您可以指定要与ld的--dynamic-linker开关一起使用--dynamic-linker器,但可能存在其他差异。 例如,Android使用一个名为bionic的精简libc实现,它可能缺少程序所依赖的function,或者具有不同的行为。

在编译Android程序时,您应该使用NDK或其他Android目标工具链。 即使它基于Linux内核,但差异足够大,以Linux为目标的工具链是不够的。