2009-03-12 6 views
1

Je fais simple lib à utiliser dans mes applications pour me sauver la peine de définir quelques fonctions encore et ...Création d'un problème statique Lib dans Linux

Voici mon makefile:

CC=gcc 
CFLAGS=-Wall -g -Wextra 
OBJS=getline.o debug.o 
LIB=libjimi.a 
.PHONY: clean purge 

libjimi.so : $(OBJS) 
     ar rcs $(LIB) $(OBJS) 
     @echo done! 
%.o : %.c 
     $(CC) $(CFLAGS) -c $^ 

clean : 
     @rm *.o 

purge : clean 
     @rm $(LIB) 

Maintenant, je reçois un segfault si je lier la bibliothèque, mais si je lier les fichiers objets que je lier pour créer la bibliothèque, cela fonctionne ... conseil?

+0

Voulez-vous dire que vous obtenez la faute seg au moment de la liaison ou lorsque vous exécutez l'exécutable lié? –

Répondre

2

Votre cible dit libjimi.so qui est l'extension pour une bibliothèque partagée, elle devrait juste être libjimi.a pour une librairie statique.

Et notez que lorsque vous utilisez une bibliothèque statique, vous la liez comme n'importe quel autre fichier objet, mais avec une bibliothèque partagée, vous utilisez la syntaxe -l.

+0

aha merci, ça marche –

+0

Bien sûr vous pouvez lier avec -ljimi si c'est statique ou dynamique (pour libjimi.a ou libjimi.so). La bibliothèque doit juste être dans l'un des répertoires recherchés (-L/some/where/lib pour ajouter des répertoires; -L. Est rarement nécessaire). –

+0

Je pense que vous avez raison, mais je me souviens de mon problème avec ça, il y avait un libsomething.a et libsomething.so sur mon système et quand je voulais la version .a, le commutateur -l choisissait toujours la version .so au lieu de Une version. – Zitrax

1

Les bibliothèques statiques sous Linux (Unix) se terminent normalement par '.a'; Les objets partagés se terminent par '.so'. Votre règle de la bibliothèque est actuellement:

libjimi.so : $(OBJS) 
    ar rcs $(LIB) $(OBJS) 
    @echo done! 

Il devrait être:

$(LIB): $(OBJS) 
    ar rcs $(LIB) $(OBJS) 
    @echo done! 

Personnellement, je tendance à utiliser

AR  = ar 
ARFLAGS = rv 

Menant à:

$(LIB): $(OBJS) 
    $(AR) $(ARFLAGS) $(LIB) $(OBJS) 

Maintenant tous les aspects de la construction peut être réglé en définissant des macros - si nécessaire.

Sans savoir où l'accident se produit, il est difficile de savoir ce qui pourrait l'être. Une possibilité est qu'en raison de la confusion makefile, vous liez avec une ancienne version de la bibliothèque et non avec la version de travail en cours. Incidemment, il n'est pas agréable de cacher ce que fait une cible clean ou purge; il est préférable de laisser make faire écho aux commandes (pas de @ devant). Le @ est entièrement approprié pour le echo cependant; son absence conduirait à la même information présentée deux fois.

Questions connexes