web-dev-qa-db-fra.com

Ajouter les bibliothèques .so et .a à Makefile

J'ai un fichier makefile qui ressemble à ceci. 

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

Je veux ajouter les chemins suivants des bibliothèques statiques au makefile.

/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

comment puis-je faire cela. 

9
rajat

Permet de considérer votre /usr/local/lib/libYARP_OS.a

Ce que vous pouvez faire est d’avoir -L/usr/local/lib/ dans votre fichier Make comme l’une des variables. Et ensuite, vous pouvez ajouter -lYARP_OS à LDLIBS.

-L est le chemin d'accès à la bibliothèque et -l est le nom de la bibliothèque. libYARP_OS.a sera passé sous la forme -lYARP_OS.

Sur la ligne de commande, vous feriez quelque chose comme: gcc -o main main.c -L/usr/local/lib/ -lYARP_OS. Cela devrait vous donner une idée.

12
Swair

Vous pouvez soit utiliser un indicateur -L<path> pour indiquer à GCC l'emplacement de n'importe quelle bibliothèque, puis l'inclure dans -l<libname>. Par exemple, ce serait 

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

comme noté par swair.

Alternativement, vous pouvez également fournir le chemin complet de la bibliothèque statique et compiler directement, comme

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

Voir 'Bibliothèques partagées et bibliothèques statiques' pour plus de détails.

Dans votre cas spécifique, je les ajouterais à la ligne LDLIBS=.

NB: Faites attention lorsque vous liez une commande, ceci est pertinent lorsque vous liez des programmes. Voir 'Ordre des liens des bibliothèques' pour plus de détails. Par exemple:

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

travaux

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

Voir aussi cette question similaire: Comment créer un lien vers une bibliothèque statique en C?

9
Tim

Ajoutez -lYARP_OS -lYARP_sig -lYARP_math -lYARP_dev -lYARP_name -lYARP_init à LDLIBS.

Attention: l'ordre de liaison peut avoir de l'importance.

Assurez-vous également que l'éditeur de liens sache que /usr/local/lib est un endroit où rechercher des bibliothèques, sinon indiquez-le avec -L/usr/local/lib (vous pouvez ajouter une autre variable de makefile, par exemple LIBPATHS ou quelque chose de similaire, pour contenir les chemins des bibliothèques).

En résumé, si vous avez une bibliothèque libMyLib.a dans le dossier /my/path, la variable gcc (ou g++) peut être appelée avec les paramètres suivants:

gcc -L/my/path -lMyLib [...]
  • -L est utilisé pour inclure les chemins où l'éditeur de liens cherchera des bibliothèques
  • -l est utilisé pour lier une bibliothèque, qui doit être passée sans le préfixe lib et l'extension

Cette question peut être utile pour une compréhension générale de l'utilisation des bibliothèques en C et C++: Comment utiliser les bibliothèques

5
Vincenzo Pii

Dans Makefile, ajoutez comme ceci 

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

Cela reliera les bibliothèques dont vous avez besoin

0
pauljames840