macos - estatica - como crear librerias dinamicas en java
MacOS: cómo vincular una biblioteca dinámica con una ruta relativa mediante gcc/ld (2)
Si está tratando de comprender la vinculación dinámica, esta pregunta probablemente sea de interés.
Una de las respuestas a esa pregunta proporciona un maravilloso ejemplo de cómo crear y usar una biblioteca dinámica. En base a ello, tengo algunos archivos simples:
C Principal:
extern void someFunction (int x);
int main (int argc, char** argv ) {
someFunction(666);
}
mylibrary.c:
#include <stdio.h>
void someFunction (int x) {
printf ("/nsomeFunction called with x=%d/n", x);
}
makefile
main: mylibrary.c main.c
gcc -c mylibrary.c
gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib
gcc -c main.c
gcc -v main.o ./libmylibrary.dylib -o main
clean:
rm *.o
rm main
rm *.dylib
Hasta ahora, todo funciona muy bien. Si hago y luego ingreso ./main en el símbolo del sistema, veo el resultado esperado:
someFunction called with x=666
Ahora, quiero mezclar las cosas un poco. He creado un directorio hidelib, que es un subdirectorio de mi directorio principal. Y estoy agregando una línea a mi makefile:
main: mylibrary.c main.c
gcc -c mylibrary.c
gcc -dynamiclib -current_version 1.0 mylibrary.o -o libmylibrary.dylib
gcc -c main.c
mv libmylibrary.dylib hidelib # this is the new line
clean:
rm *.o
rm main
rm hidelib/*.*
Ahora, quiero agregar otra línea al archivo make para que encuentre libmylibrary.dylib en el subdirectorio hidelib. Quiero poder ejecutar ./main de la misma manera. ¿Cómo puedo hacer eso?
EDIT: Gracias por la respuesta. Tener muchas opciones es maravilloso, pero un principiante solo quiere una opción concreta que funcione. Aquí está lo que estoy intentando para la última línea, pero claramente no entiendo algo. El archivo make se ejecuta sin errores, pero en tiempo de ejecución dice "biblioteca no encontrada".
gcc main.o -rpath,''$$ORIGIN/hidelib'' -lmylibrary -o main
Probablemente necesite la -L
compilador / enlazador que se agrega a la ruta de búsqueda para las bibliotecas.
Si intentas mover cosas después de vincular, necesitarás una variable de entorno dyld
donde buscar. man dyld
y debería poder obtener más información sobre DYLD_LIBRARY_PATH
y otras variables de entorno.
Sin embargo, normalmente, establece el nombre de instalación de la biblioteca antes de vincular algo con el indicador del vinculador -install_name
a algo como @rpath/mylibrary.dylib
como el valor, luego establece las rutas de búsqueda de la ruta de ejecución en el ejecutable principal mientras compila con el -rpath
indicador a @executable_path/hidelib
.
Para obtener más información, consulte install_name_tool
y los argumentos -rpath
& -install_name
de ld
.
Básicamente, hay muchas opciones para lo que estás tratando de hacer.
Una opción concreta que funciona sería establecer el indicador install_name
al vincular el .dylib
.
gcc -dynamiclib -install_name ''$(CURDIR)/hidelib/libmylibrary.dylib'' -current_version 1.0 mylibrary.o -o libmylibrary.dylib
Entonces simplemente puede enlazar a la biblioteca normalmente:
gcc main.o -L ''$(CURDIR)/hidelib'' -lmylibrary -o main