私は2つのファイルを持っています:
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=
pwd
gcc -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=
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 メイン
adb push main /system/app
スマートフォンの正しいフォルダーで ./main を実行した結果は次のとおりです。
./メイン: 見つかりません
私のファイルがそこにあるとしても!
クロスコンパイル プロセス中に何か不足していますか? 何か助けはありますか?CodeSourcery のクロスコンパイラを使用していますが、.so ライブラリのない静的プログラムではうまく機能します。ありがとう
編集:Igorが以下に述べているように、それはリンカの問題でした。このコマンドはそれを修正します:
arm-none-linux-gnueabi-gcc -o test main.c -Wl,--dynamic-linker=/system/bin/linker -ldl
私の場合、 /system/lib/ には .so ファイルがあまりないため、他のライブラリが必要です。