Hier kommt ein Beispiel in die Nähe Ihres eigenen Makefiles.
Make-Datei:
CC=gcc
CFLAGS=-Wall -Wextra -Werror -std=gnu99
.PHONY:all mrproper clean
all:libmyLibrary.so dynamic testDynamic
dynamic:lab3.o
$(CC) $(CFLAGS) -o dynamic lab3.o -L. -lmyLibrary -lm
lab3.o:lab3.c
$(CC) $(CFLAGS) -c -o lab3.o lab3.c
myLibrary.o:myLibrary.c
$(CC) $(CFLAGS) -fPIC -c myLibrary.c -o myLibrary.o
libmyLibrary.so:myLibrary.o
$(CC) $(CFLAGS) -shared -o libmyLibrary.so myLibrary.o -lm
testDynamic.o:testDynamic.c
$(CC) $(CFLAGS) -o testDynamic.o -c testDynamic.c
testDynamic:testDynamic.o
$(CC) $(CFLAGS) -o testDynamic testDynamic.o -ldl
mrproper:clean
rm -f dynamic libmyLibrary.so testDynamic
clean:
rm -f lab3.o myLibrary.o testDynamic.o
Verwenden -lm
nur bei der Verknüpfung. -fPic
ist nur erforderlich beim Verknüpfen der dynamischen Bibliothek. -lmyLibrary
ist nur erforderlich, wenn das Programm mit der dynamischen Bibliothek verknüpft wird. Das Generieren von testDynamic
benötigt es nicht, da es die Bibliothek dynamisch lädt, es muss nicht mit ihm verknüpft werden.
sdv.h:
#ifndef SDV_H
#define SDV_H
extern void sdv_print_version();
#endif
myLibrary.c:
#include <stdio.h>
#include <stdlib.h>
void sdv_print_version()
{
printf("v1.0\n");
}
testDynamic.c:
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#define MY_LIB "libmyLibrary.so"
#define PRINT_VERSION "sdv_print_version"
int main()
{
void *handle = dlopen(MY_LIB, RTLD_LAZY);
if (handle == NULL)
{
fprintf(stderr, "%s\n", dlerror());
return 1;
}
void (*p_print_version)() = NULL;
p_print_version = dlsym(handle, PRINT_VERSION);
if (p_print_version == NULL)
{
printf("No version available.\n");
fprintf(stderr, "%s\n", dlerror());
}
else
{
(*p_print_version)();
}
if (dlclose(handle) != 0)
{
fprintf(stderr, "%s\n", dlerror());
}
return 0;
}
Jetzt Gebäude:
>make
gcc -Wall -Wextra -Werror -std=gnu99 -fPIC -c myLibrary.c -o myLibrary.o
gcc -Wall -Wextra -Werror -std=gnu99 -shared -o libmyLibrary.so myLibrary.o -lm
gcc -Wall -Wextra -Werror -std=gnu99 -c -o lab3.o lab3.c
gcc -Wall -Wextra -Werror -std=gnu99 -o dynamic lab3.o -L. -lmyLibrary -lm
gcc -Wall -Wextra -Werror -std=gnu99 -o testDynamic.o -c testDynamic.c
gcc -Wall -Wextra -Werror -std=gnu99 -o testDynamic testDynamic.o -ldl
Lassen Sie uns eine erste Version der dynamischen Bibliothek halten: Jetzt
>mkdir v1.0
>mv libmylibrary.so v1.0/
aktualisieren myLibrary.c:
#include <stdio.h>
#include <stdlib.h>
void sdv_print_version()
{
printf("v2.0\n");
}
Bauen wieder:
>make
gcc -Wall -Wextra -Werror -std=gnu99 -fPIC -c myLibrary.c -o myLibrary.o
gcc -Wall -Wextra -Werror -std=gnu99 -shared -o libmyLibrary.so myLibrary.o -lm
Lassen Sie uns diese neue dynamische Bibliothek verschieben in ein anderes Verzeichnis :
>mkdir v2.0
>mv libmylibrary.so v2.0/
nun ohne dynamische Bibliothek Testen zur Verfügung:
>export LD_LIBRARY_PATH=./
>PATH=$PATH:.
>dynamic
dynamic: error while loading shared libraries: libmyLibrary.so: cannot open shared object file: No such file or directory
>testDynamic
libmyLibrary.so: cannot open shared object file: No such file or directory
Was ist der Unterschied? In "testDynamic.c" konnten wir anstelle eines Nachrichtenfehlers einen alternativen Algorithmus verwenden, der "libmyLibrary.so" nicht benötigt.
Jetzt überprüfen wir können "libmyLibrary.so ":
>cd v1.0
>../dynamic
v1.0
>../testDynamic
v1.0
>cd ../v2.0
>../dynamic
v2.0
>../testDynamic
v2.0
Könnten Sie geben die Fehlermeldung und minimale Quelle für testDynamic – dvhh
?‚Die Bibliothek habe ich erstellt eine DLL‘‚libmyLibrary.so‘ist, dies ein wenig verwirrend für mich scheint, eine DLL gibt mir Der Eindruck, den Sie für Windows verwenden, aber .so Datei sind dynamische Bibliotheken für UNIX, also was ist Ihr Betriebssystem genau? – jdarthenay
Der Fehler, den ich bekomme, ist "Fehler beim Laden gemeinsam genutzter Bibliotheken: libmyLibrary.so: kann nicht freigegebene Objektdatei öffnen: Nein Datei oder Verzeichnis @ dvhh – rtayl0a