Michael Schilling
Necesito vincular dinámicamente una biblioteca que he creado. No estoy exactamente seguro de cuál es el problema. Todo se compila correctamente, pero siempre atrapo handle
como el NULL
puntero:
void *handle;
char *error;
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY);
//same error comes up with full path as well as './hw11...'
if(!handle){
error = dlerror();
printf("%s\n", error);
printf("Error loading library.\n");
exit(1);
}
No puedo pasar este error y no estoy seguro de qué podría estar mal. Estoy bastante seguro de que he compilado todo correctamente. Estos son los pasos de compilación que usé:
gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4
me sale un error que dice
solo se pueden cargar ET_DYN y ET_EXEC.
al construir hw11-lib-michaelSchilling.so
no pareces estar diciendo gcc
que desea un objeto compartido (el .so
en el nombre no es suficiente).
Con el -c
está produciendo un archivo de objeto (no un compartido objeto) y llamándolo michaelSchilling.so
. El enlazador ni siquiera se invoca.
Quitar el -c
desde el gcc
línea de comando y agregar -shared
:
gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
-
Junto con
-rdynamic
? Acabo de probarlo con ambos y con solo-shared
pero tengo el mismo error.– Michael Schilling
3 de diciembre de 2011 a las 22:16
-
@MichaelSchilling: No creo
-rdynamic
tiene algo que ver con el problema, por lo que también puede conservarlo en caso de que su código lo necesite.– ENP
3 de diciembre de 2011 a las 22:18
-
@MichaelSchilling: ¿Ha quitado el
-c
?– ENP
3 de diciembre de 2011 a las 22:19
una barra (/
) como el primer carácter de un nombre de ruta indica que el nombre de ruta es absoluto (relativo al directorio raíz), no relativo al directorio de trabajo actual y ciertamente no relativo a la ubicación del binario. Deberá especificar la ruta completa averiguando la ubicación del binario (que no es un problema fácil en sí mismo) o podría usar $ORIGIN
con dlopen
(funciona con rpath pero no estoy seguro si funciona con dlopen
).
-
¿Qué pasa con un período antes del camino? (
./
)– Michael Schilling
3 de diciembre de 2011 a las 21:59
-
Eso lo hace relativo al directorio de trabajo actual, no a la ubicación de su programa binario.
– R.. GitHub DEJA DE AYUDAR A ICE
4 de diciembre de 2011 a las 15:21
mostaza col
gcc -fPIC -shared -rdynamic library.c -o library.o
funciona para mí en Linux al compilar la biblioteca para el código que lo abre, necesita -ldl
Es hw11-lib-michaelSchilling.so
en la raíz absoluta de su sistema de archivos? Estás afirmando que es con una barra oblicua… pero sospecho que no lo es.
En su manejo de errores, incluya la salida de dlerror()
en lo que imprimes, para encontrar la causa del fallo.