【发布时间】:2013-02-03 01:10:23
【问题描述】:
我有两个文件:
lib.c
#include<stdio.h>
void hi() {
printf("Hi i'm a library function in lib.so\n");
}
和main.c
#include<stdio.h>
#include<dlfcn.h>
/* 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);
}
我尝试使用以下命令构建可执行文件:
导出 LD_LIBRARY_PATH=
pwdgcc -c -fpic lib.c
gcc -shared -lc -o lib.so lib.o
gcc main.c -ldl
而且效果很好。 然后我尝试使用以下命令在 Android(Nexus One,带有 ARM-v7-0a 架构)上导出我的程序:
导出 LD_LIBRARY_PATH=
pwdarm-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 文件。
【问题讨论】:
-
您不使用 NDK 的任何特殊原因?
-
C 代码在安卓设备上执行后是否无法在其文件夹中找到 .so?我知道程序应该在同一个文件夹中检查 .so 库文件 /usr/lib 或 /usr/local/lib 但我的设备上没有后两者
-
向
main添加错误检查和dlerror调用怎么样? -
@Michael:我不能使用 NDK,我应该使用命令行通过单个交叉编译器调用来实现此类代码的执行。
-
由于
"./lib.so"包含一个斜杠,dlopen应该只尝试该文件名,所有关于LD_LIBRARY_PATH和/usr/lib 的内容都不应该适用。
标签: android c arm cross-compiling codesourcery