Si está intentando comprender la vinculación dinámica, es probable que this question sea de su interés.MacOS: cómo vincular una biblioteca dinámica con una ruta relativa mediante gcc/ld
Una de las respuestas a esa pregunta proporciona un maravilloso ejemplo de creación y uso de una biblioteca dinámica. Basado en ella, algunos archivos simples:
main.c:
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 entrar en ./main en el símbolo del sistema, veo la salida esperada:
someFunction called with x=666
Ahora, quiero mezclar las cosas un poco. Creé un directorio hidelib, que es un subdirectorio de mi directorio principal. Y yo estoy añadiendo 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 añadir otra línea para el makefile por lo que se encuentra en el subdirectorio libmylibrary.dylib 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. Esto es lo que intento para la última línea, pero claramente no entiendo nada. El archivo MAKE se ejecuta sin errores, pero en el tiempo de ejecución dice "biblioteca no encontrada".
gcc main.o -rpath,'$$ORIGIN/hidelib' -lmylibrary -o main