Error durante la interconexión de código C con bibliotecas dinámicas
Tengo dos archivos:
lib.c
- ¿Hay una manera de escribir iphone y aplicaciones de Android usando Visual Studio y c #?
- La aplicación de Android NDK no puede acceder a ningún punto de interrupción
- Compilación cruzada de GCC con newlib para ARM: cómo especificar opciones de GCC como -march?
- Superposición de color en android NDK
- TeamSpeak SDK en Android con Qt
#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.
- ¿Cómo hacer que QVideoProbe funcione?
- ¿Puedo incluir la biblioteca c ++ en la extensión nativa de Adobe Air para móviles IOS / Android?
- Biblioteca multiplataforma para comunicaciones entre C ++ y código nativo de plataforma (iOS, Android)
- Cocos2d-x setAnimationInterval no funciona en Android
- OpenCV Android - No se puede resolver la función JNI correspondiente
- Cómo reparar Genymotion en linux ElementaryOS con error `CXXABI_1.3.8 'no encontrado
- Tipo de plataforma Qt Check: Móvil o Escritorio
- Error :() referencia indefinida a `__android_log_write 'ERROR?
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.
- ActionbarSherlock abrir submenú en el menú del dispositivo en keydown haga clic en android
- Android por qué este botón no se puede hacer clic