2016-04-08 17 views
0

Hallo an die guten Leute von Stack Overflow, ich bin wieder mit den Fragen dabei! haha Also habe ich ein paar Dateien, die ich versuche zu kompilieren und zu verknüpfen. Die Bibliothek, die ich erstellt habe, ist eine DLL. Verwenden einer RTLD_LAZY Methode. Ich habe die Bibliothek im selben Verzeichnis wie die Anwendung. Es fällt mir schwer, diese Aufgabe zu erledigen. Ich versuche es mit -ldl zu verknüpfen.Dynamic Link Library mit Makefile

Meine Dateien, die ich habe, sind:

lab3.c  //Which has my main 
myLibrary.c //which is my library 
sdv.h   //which is my header file 
testDynamic.c //which is my handle file for the RTLD_LAZY 

Hier ist, was ich bisher getan haben, aber ich bin auf etwas klar Verschrauben ..

dynamic: lab3.o myLibrary.o test 
     gcc -o dynamic lab3.o myLibrary.o -lm 

lab3.o: lab3.c 
     gcc -fPIC -c -o lab3.o lab3.c -lm 

myLibrary.o: myLibrary.c 
     gcc -fPIC -c myLibrary.c -o myLibrary.o -lm 

libmyLibrary.so: myLibrary.o 
     gcc -shared -o libmyLibrary.so myLibrary.o -lm 

testDynamic.o: 
     gcc testDynamic.c -L. -lmyLibrary -o test -ldl 

export LD_LIBRARY_PATH=./ 

Jede Beratung sehr geschätzt wird ! Danke im Voraus!

+0

Könnten Sie geben die Fehlermeldung und minimale Quelle für testDynamic – dvhh

+1

?‚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

+0

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

Antwort

0

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