it-swarm.dev

Fügen Sie .so- und .a-Bibliotheken zu Makefile hinzu

Ich habe ein Makefile, das so aussieht. 

DEFINES=-std=c++0x
INCS_GTK=-I/usr/include/gtk-2.0 -I/usr/include/glib-2.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/gtk-2.0/gdk -I/usr/include/pango-1.0 -I/usr/lib/gtk-2.0/include -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include
INCS=-I/usr/include/freetype2 -I/usr/include/mysql -Iframeworks ${INCS_GTK}
LDLIBS=-lconfig++ -lcxcore -lcv -lGL -lGLU -lglut -lhighgui -lSDL -lftgl -lueye_api -lboost_filesystem -lboost_system -lann -lpthread -lflycapture -lglog -lmysqlpp -lmysqlclient -lunittest++
DEBUG=-g -pg
WARNINGS=-Wall -Wextra -pedantic -Wno-long-long #-O3 -Weffc++
BUILDDIR=build
BINDIR=dist

MAINCXX=${Shell find -name '*.cxx'}
TARGETS=${MAINCXX:%.cxx=%}
CXXFLAGS=${DEBUG} ${WARNINGS} ${DEFINES} ${INCS}
LDFLAGS=${DEBUG} ${WARNINGS} ${DEFINES}
include IDEconfigs/Makefile/generic.mk

Ich möchte die folgenden Pfade statischer Bibliotheken zum Makefile hinzufügen.

/usr/local/lib/libYARP_OS.a  /usr/local/lib/libYARP_sig.a  /usr/local/lib/libYARP_math.a  /usr/local/lib/libYARP_dev.a  /usr/local/lib/libYARP_name.a  /usr/local/lib/libYARP_init.a

wie mache ich das? 

9
rajat

Betrachten wir Ihren /usr/local/lib/libYARP_OS.a

Was Sie tun können, ist -L/usr/local/lib/ in Ihrem Makefile als eine der Variablen. Dann können Sie -lYARP_OS an LDLIBS anhängen.

-L steht für Pfad zur lib und -l ist der lib-Name. libYARP_OS.a wird als -lYARP_OS übergeben.

In der Befehlszeile würden Sie Folgendes tun: gcc -o main main.c -L/usr/local/lib/ -lYARP_OS. Dies sollte Ihnen eine Idee geben.

12
Swair

Sie können entweder das Flag -L<path> verwenden, um GCC den Speicherort einer Bibliothek mitzuteilen, und diese dann mit -l<libname> einschließen. Das wäre zum Beispiel 

$ gcc -o main main.c -L/usr/local/lib/ -lYARP_SO

wie von swair bemerkt.

Alternativ können Sie auch den vollständigen Pfad der statischen Bibliothek angeben und direkt kompilieren, z

$ gcc -o main main.c /usr/local/lib/libYARP_OS.a

Weitere Informationen finden Sie unter 'Gemeinsame Bibliotheken und statische Bibliotheken' .

In Ihrem speziellen Fall würde ich sie der Zeile LDLIBS= hinzufügen.

Hinweis: Seien Sie vorsichtig beim Verknüpfen der Reihenfolge. Dies ist relevant, wenn Sie Programme miteinander verknüpfen. Weitere Informationen finden Sie unter 'Linkreihenfolge der Bibliotheken' . Zum Beispiel:

$ gcc -Wall calc.c -lm -o calc   (correct order)

funktioniert

$ cc -Wall -lm calc.c -o calc    (incorrect order)
main.o: In function `main':
main.o(.text+0xf): undefined reference to `sqrt'

Siehe auch diese ähnliche Frage: Wie verlinke ich eine statische Bibliothek in C?

9
Tim

Hängen Sie -lYARP_OS -lYARP_sig -lYARP_math -lYARP_dev -lYARP_name -lYARP_init an LDLIBS an.

Achtung: Die Verknüpfungsreihenfolge kann von Bedeutung sein.

Stellen Sie außerdem sicher, dass der Linker weiß, dass /usr/local/lib ein Ort ist, an dem Sie nach Bibliotheken suchen können. Andernfalls können Sie ihn mit -L/usr/local/lib angeben (Sie können eine andere Makefile-Variable hinzufügen, z. B. LIBPATHS oder ähnliches), um die Bibliothekspfade zu enthalten.

Wenn Sie eine Bibliothek libMyLib.a im Ordner /my/path haben, können Sie gcc (oder g++) mit folgenden Parametern aufrufen:

gcc -L/my/path -lMyLib [...]
  • -L wird verwendet, um Pfade anzugeben, in denen der Linker nach Bibliotheken sucht
  • -l wird verwendet, um eine Bibliothek zu verknüpfen, die ohne das Präfix lib und die Erweiterung übergeben werden muss

Diese Frage kann für ein allgemeines Verständnis der Bibliotheksnutzung in C und C++ hilfreich sein: So verwenden Sie Bibliotheken

5
Vincenzo Pii

Fügen Sie in Makefile so hinzu 

USER_LIBS = -lYARP_OS -lYARP_sig -lYARP_math -lYARP_dev -lYARP_name -lYARP_init

Dadurch werden die benötigten Bibliotheken verknüpft

0
pauljames840