Error durante la interconexión de código C con bibliotecas dinámicas

Tengo dos archivos:

lib.c

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

y 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); } 

Y he intentado construir un ejecutable utilizando los siguientes comandos:

export LD_LIBRARY_PATH = pwd

gcc -c -fpic lib.c

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

gcc main.c -ldl

Y funciona bastante bien. Entonces he intentado exportar mi programa en Android (Nexus One, con arco ARM-v7-0a) usando los siguientes comandos:

export LD_LIBRARY_PATH = pwd

brazo-ninguno-linux-gnueabi-gcc -c -fpic lib.c

brazo-ninguno-linux-gnueabi-gcc -shared -lc -o lib.so lib.o

brazo-ninguno-linux-gnueabi-gcc main.c -ldl -o principal

adb push main / system / app

El resultado de ejecutar ./main en la carpeta correcta en mi teléfono inteligente es sólo:

./main: no encontrado

incluso si mi archivo está ahí!

¿Estoy perdiendo algo durante el proceso de compilación cruzada? ¿Alguna ayuda? Estoy utilizando el compilador cruzado de CodeSourcery y funciona bien para programas estáticos sin bibliotecas .so. Gracias

EDIT : como Igor indica a continuación, que era un problema vinculante. Este comando lo corrige:

brazo-ninguno-linux-gnueabi-gcc -o test main.c -Wl, – dynamic-linker = / sistema / bin / linker -ldl

en mi caso, necesito otras bibliotecas porque en / system / lib / no hay muchos archivos .so.

El mensaje "no encontrado" se refiere no al objeto compartido sino al vinculador dinámico. Linux utiliza /lib/ld-linux.so.2 (o /lib64/ld-linux-x86-64.so.2 para x64) mientras que Android utiliza /bin/linker . Puede comprobar qué cargador dinámico utiliza su programa con readelf -l , por ejemplo:

 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] 

Puede especificar un vinculador para usar con el --dynamic-linker ld, pero es probable que haya otras diferencias. Por ejemplo, Android utiliza una implementación libc simplificada llamada biónica y puede que falte funcionalidad en la que se basa su programa o que tenga un comportamiento diferente.

Debe utilizar NDK u otra cadena de herramientas orientada a Android cuando compile programas para Android. A pesar de que se basa en el kernel de Linux, las diferencias son lo suficientemente grandes como para que las cadenas de herramientas orientadas a Linux no sean suficientes.

  • ¿Asio o Boost.Asio funcionarán en iPhone o Android?
  • Android NDK y C + + STL
  • Construir biblioteca compartida enlazando a otras bibliotecas no estándar compartidas
  • Pasos de convertir el proyecto C ++ opencv en la computadora a opencv android
  • Xamarin C # - Android - Impedir que un AlertDialog cierre en PositiveButton haga clic
  • Asp.net: ¿Cómo detectar iOS / Android?
  • Xamarin y código c ++
  • ¿Podemos acceder al controlador de micrófono de mi teléfono Android
  • Cómo utilizar unordered_map en Android?
  • Utilizar C ++ con Android ndk / jni
  • Cómo construir / utilizar sharpen de XobotOS?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.