wake-up-neo.net

Wie man eine statische Bibliothek in ein Makefile einfügt

Ich habe folgendes Makefile

CXXFILES = pthreads.cpp 

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = -lpthread -ldl

all:
    $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS)

clean:
    rm -f prog *.o

Ich versuche, die ./libmine-Bibliothek in CXXFLAGS einzuschließen, aber es scheint nicht der richtige Weg zu sein, eine statische Bibliothek einzuschließen, da ich beim Kompilieren des Programms viele undefinierte Verweise auf Fehler bekomme. Was ist eigentlich der richtige Weg, um eine statische Bibliothek in das Makefile aufzunehmen?

24
pythonic
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = libmine.a -lpthread 
13
ouah

benutzen 

LDFLAGS= -L<Directory where the library resides> -l<library name>

Mögen :

LDFLAGS = -L. -lmine

um eine statische Kompilierung sicherzustellen, können Sie auch hinzufügen

LDFLAGS = -static

Oder Sie können einfach die gesamte Bibliotheksuche loswerden und direkt damit verlinken.

sag, du hast main.c fun.c

und eine statische Bibliothek libmine.a

dann können Sie es einfach in Ihrer letzten Link-Zeile des Makefiles tun

$(CC) $(CFLAGS) main.o fun.o libmine.a
38
Aftnix

Stellen Sie sicher, dass die Option -L vor der Option -l angezeigt wird. die Reihenfolge der Optionen in Linker-Befehlszeilen do matter, insbesondere mit statischen Bibliotheken. Die Option -L gibt ein Verzeichnis an, in dem nach Bibliotheken (statisch oder gemeinsam) gesucht werden soll. Die Option -lname gibt eine Bibliothek an, die libmine.a (statisch) oder libmine.so (gemeinsam mit den meisten Unix-Varianten, aber Mac OS X verwendet .dylib und HP-UX zur Verwendung von .sl) verwendet. Üblicherweise befindet sich eine statische Bibliothek in einer Datei libmine.a. Dies ist eine Konvention, nicht zwingend, aber wenn der Name nicht im libmine.a-Format vorliegt, können Sie die -lmine-Notation nicht verwenden, um ihn zu finden. Sie müssen es explizit in der Befehlszeile des Compilers (Linker) auflisten.

Die -L./libmine-Option sagt "es gibt ein Unterverzeichnis mit dem Namen libmine, in dem nach Bibliotheken gesucht werden kann". Ich sehe drei Möglichkeiten:

  1. Sie haben ein solches Unterverzeichnis mit libmine.a. In diesem Fall müssen Sie auch -lmine zur Linker-Zeile hinzufügen (nach den Objektdateien, die auf die Bibliothek verweisen).
  2. Sie haben eine Datei libmine, bei der es sich um ein statisches Archiv handelt. In diesem Fall listen Sie es einfach als Datei ./libmine ohne vorangestellten -L auf. 
  3. Sie haben eine Datei libmine.a im aktuellen Verzeichnis, die Sie abholen möchten. Sie können entweder ./libmine.a oder -L . -lmine schreiben und beide sollten die Bibliothek finden.
11

Der -L gibt lediglich den Pfad an, wo die .a- oder .so-Datei zu finden ist. Sie möchten -lmine zur Variable LIBS hinzufügen.

Erstellen Sie diesen -static -lmine, um die Auswahl der statischen Bibliothek zu erzwingen (falls statische und dynamische Bibliothek vorhanden sind).

8
0xC0000022L

Trotz meiner Bitte an die Behörden (keine Antworten) kann ich immer noch keine eigene Frage posten. Ich suche nach Unterstützung bei dieser Aufgabe: Ich habe ein Hauptprojekt und eine statische Bibliothek damit verbunden. Alles funktioniert wie erwartet. Da BEIDE Projekte in der Entwicklung sind, muss ich zuerst die Bibliothek und dann das Hauptprojekt kompilieren. Ich weiß, dass es eine Möglichkeit gibt, diesen Prozess zu automatisieren, den er vor Jahren in MFC (Batch-Dateien?) Verwendet hat, aber erinnere mich nicht an die Details. Etwas im Zusammenhang mit der Vor-/Nachbearbeitung. 

0
Jan Hus