2016-10-03 1 views
0

Ich habe eine Bibliothek, die die Log-Funktion von math.h verwendet. Wenn ich diese Bibliothek kompiliere und paketiere, bekomme ich keine Kompilierungsfehler, was normal ist (denke ich).Korrekte Verknüpfung einer statischen Bibliothek mit der C Math Bibliothek

Jetzt, wenn ich versuche, die Bibliothek in einer Anwendung zu verwenden, gibt gcc mir Fehler Linker:

Compiling mytestlist using "mytestlist.o": 
gcc mytestlist.o -I/student/cmpt332/pthreads -I. -std=c99 -Wall -pedantic -L. -L/student/cmpt332/pthreads/lib/linuxx86_64/ -llist -o mytestlist 
./liblist.a(list_adders.o): In function `NodeCreate': 
list_adders.c:(.text+0x343): undefined reference to `log' 
./liblist.a(list_adders.o): In function `ListCreate': 
list_adders.c:(.text+0x62f): undefined reference to `log' 
./liblist.a(list_adders.o): In function `ListFree': 
list_adders.c:(.text+0xdcc): undefined reference to `log' 
list_adders.c:(.text+0xe55): undefined reference to `log' 
list_adders.c:(.text+0xefb): undefined reference to `log' 
./liblist.a(list_adders.o):list_adders.c:(.text+0xf96): more undefined references to `log' follow 
collect2: error: ld returned 1 exit status 
Makefile:47: recipe for target 'mytestlist' failed 
make: *** [mytestlist] Error 1 

Warum ist das passiert? Die einzige Lösung, die funktioniert, ist, dass ich die -lm Option an gcc liefern muss, wenn ich das Programm kompiliere, das die Bibliothek verwendet (obwohl das Programm selbst math.h nicht verwendet), aber ich finde das umständlich zu tun.

Ich habe auch versucht, die -lm Option beim Kompilieren der Bibliothek, aber wenn die Anwendung mit der Bibliothek kompiliert wird, bekomme ich die gleichen Linker-Fehler.

Gibt es eine Möglichkeit, die Bibliothek mit math.h zu kompilieren, ohne -lm an andere Programme zu liefern, die die Bibliothek verwenden?

Falls Sie sich fragen, kompilieren ich jedes Objekt, das die Bibliothek bildet mit:

gcc -std=c99 -Wall -pedantic -static -I. -c list_adders.c -o list_something.o -lm 

Und die Bibliothek verpackt mit:

ar cvfr liblist.a list_something.o ... 
+3

Eine statische Bibliothek ist nicht verknüpft. Es gibt keine Möglichkeit, es mit der Mathebibliothek zu verknüpfen, da es keine Möglichkeit gibt, es überhaupt zu verknüpfen. Sie verknüpfen eine Anwendung oder eine gemeinsam genutzte Bibliothek, aber keine statische Bibliothek. Es gibt auch keine Möglichkeit, Abhängigkeiten Ihrer statischen Bibliothek in der Bibliothek selbst zu markieren oder aufzuzeichnen. –

Antwort

4

In Ihrem gcc -c Befehl, die -lm macht nichts. Es ist eine Linker-Option, und -c bedeutet "nicht verknüpfen".

Der richtige Ort zu setzen -lm ist in der Tat nach der -llist, wann immer Sie es verwenden. Auf diese Weise werden statische Bibliotheksabhängigkeiten ausgeführt. Legen Sie es in die Dokumentation für liblist.

Wenn Sie etwas schicker wollen, gibt es pkg-config. Mit den entsprechenden Konfigurationsdateien gibt pkg-config --static --libs liblist-llist -lm aus.

Verwandte Themen