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 ...
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. –