web-dev-qa-db-fra.com

Comment inclure une bibliothèque statique dans le makefile

J'ai le makefile suivant

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

J'essaie d'inclure la bibliothèque ./libmine dans CXXFLAGS, mais il semble que ce ne soit pas la bonne façon d'inclure une bibliothèque statique, car lorsque je compile le programme, j'obtiens une erreur de nombreuses références non définies. Alors, quelle est la bonne façon d’inclure une bibliothèque statique dans le fichier Make?

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

utilisation 

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

Comme :

LDFLAGS = -L. -lmine

pour assurer la compilation statique, vous pouvez également ajouter

LDFLAGS = -static

Ou vous pouvez simplement vous débarrasser de toute la bibliothèque en cherchant, et vous connecter directement avec.

dites que vous avez main.c fun.c

et une bibliothèque statique libmine.a

alors vous pouvez simplement faire dans votre dernière ligne de lien du Makefile

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

Assurez-vous que l'option -L apparaît avant l'option -l; l'ordre des options dans les lignes de commande de l'éditeur de liens do matter, en particulier avec des bibliothèques statiques. L'option -L spécifie un répertoire dans lequel rechercher les bibliothèques (statiques ou partagées). L'option -lname spécifie une bibliothèque avec libmine.a (statique) ou libmine.so (partagée sur la plupart des variantes d'Unix, mais Mac OS X utilise .dylib et HP-UX utilisait .sl). Classiquement, une bibliothèque statique sera dans un fichier libmine.a. Ceci est une convention, pas obligatoire, mais si le nom n'est pas au format libmine.a, vous ne pouvez pas utiliser la notation -lmine pour le trouver; vous devez l'indiquer explicitement sur la ligne de commande du compilateur (éditeur de liens).

L'option -L./libmine indique "il existe un sous-répertoire appelé libmine dans lequel il est possible d'effectuer une recherche pour trouver des bibliothèques". Je peux voir trois possibilités:

  1. Vous avez un tel sous-répertoire contenant libmine.a, auquel cas vous devez également ajouter -lmine à la ligne de l'éditeur de liens (après les fichiers objet qui font référence à la bibliothèque).
  2. Vous avez un fichier libmine qui est une archive statique. Dans ce cas, vous devez simplement le répertorier en tant que fichier ./libmine sans -L devant. 
  3. Vous avez un fichier libmine.a dans le répertoire actuel que vous voulez récupérer. Vous pouvez écrire ./libmine.a ou -L . -lmine et les deux doivent trouver la bibliothèque.
11
Jonathan Leffler

Le -L donne simplement le chemin où trouver le fichier .a ou .so. Ce que vous cherchez, c'est d'ajouter -lmine à la variable LIBS.

Créez ce -static -lmine pour le forcer à choisir la bibliothèque statique (au cas où les bibliothèques statiques et dynamiques existent).

8
0xC0000022L

Malgré mes plaidoyers auprès des autorités (pas de réponse), je ne parviens toujours pas à poser ma propre question ..__ Je cherche une assistance pour cette tâche: J'ai un projet principal et une bibliothèque statique qui y sont liés. Tout fonctionne comme prévu. Depuis que les DEUX projets sont en cours de développement, je dois d'abord compiler la bibliothèque, puis le projet principal . Je sais qu'il existe un moyen d'automatiser ce processus, utilisé il y a des années dans MFC (fichiers de traitement par lots?). ne me souviens pas des détails. Quelque chose lié au pré/post-traitement. 

0
Jan Hus