librerias libreria estatica ejemplo dinamicas dinamica crear compartidas como bibliotecas biblioteca macos gcc linker ld dynamic-library

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