2010-11-25 5 views
1

Voici mon Makefile:Comment résoudre ce problème de liaison dans Makefile?

DIR=.. 
ARG=$(QUERY_STRING) 

MAIN=main 

SRC_DIR=$(DIR)/src 
BIN_DIR=$(DIR)/bin 
INC_DIR=$(DIR)/inc 
LIB_DIR=$(DIR)/lib 

LIBS=markdown 

all: $(MAIN) exec 


$(MAIN): $(MAIN).o 
    $(LD) $^ -L $(LIB_DIR) -l $(LIBS) -o $(BIN_DIR)/[email protected] 

$(MAIN).o: $(SRC_DIR)/$(MAIN).c 
    $(CC) $^ -I $(INC_DIR) -o [email protected] 

exec: 
    $(BIN_DIR)/$(MAIN) $(ARG) 

clean: 
    rm -f *.o core.* $(BIN)/$(MAIN) 

Il est clairement défini comment je mon projet est organisé, donc ne l'expliquer. Il ne compile sans aucun problème, mais sur l'exécution binaire $(BIN_DIR)/$(MAIN) l'erreur suivante apparaît:

../bin/main: error while loading shared libraries: rintf: cannot open shared object file: No such file or directory 
make: *** [exec] Error 127 

Qu'est-ce que la bibliothèque ne rintf appartiennent? J'ai essayé de lier aussi -lc, mais cela ne résout pas le problème.

Y at-il un problème avec mon Makefile? Ou devrais-je lier quelque chose supplémentaire à $(MAIN)?

Merci d'avance pour vos réponses.

Répondre

3

Vous ne devez essentiellement jamais lier un programme en appelant ld directement; utilisez toujours votre compilateur pour faire le lien. Il passe toutes sortes d'arguments supplémentaires à ld pour que les choses fonctionnent. Remplacez le $(LD) par $(CC). Faites-le, peu importe s'il résout votre problème ou non.

'Il est étrange que vous n'obteniez pas le nom de l'objet partagé spécifié dans le message d'erreur. Cette page de manuel pour rintf() indique qu'elle est déclarée dans <math.h>; le plus probable, vous devez ajouter la bibliothèque de maths à la ligne de lien: -lm.

Je réécrire une partie de votre makefile:

LIB1 = -lmarkdown 
LIB2 = -lm 
LIBS = $(LIB1) $(LIB2) 
LDFLAGS = -L $(LIB_DIR) 

... 

$(MAIN): $(MAIN).o 
    $(CC) $^ $(LDFLAGS) $(LIBS) -o $(BIN_DIR)/[email protected] 
+2

+1. De plus, la règle 'all: $ (MAIN) exec' est imprudente; Make ne promet pas de construire les prérequis d'une cible dans l'ordre de gauche à droite. Mieux: 'all: exec' et' exec: $ (MAIN) '. – Beta

+0

@Beta: oui, vous avez raison. Personnellement, je n'aime pas particulièrement les fichiers makefile qui exécutent automatiquement les programmes qui ont été construits, mais cela pourrait être une vieille pensée brouillée. Cela dépend, en partie, de ce que l'exécution fait, je suppose; Un test unitaire ou un test de régression est logique - et c'est probablement ce qui se passe ici. Et j'ai beaucoup de contre-exemples du travail effectué au bureau. –

1

Habituellement, cette erreur apparaît lorsque l'éditeur de liens n'est pas en mesure de trouver l'objet partagé nécessaire (fichier .so). Je suppose que la plate-forme Linux. Dans Linux OS, vous pouvez rechercher le fichier en utilisant: find ou locate. Si vous pouvez trouver le fichier .so, essayez de mettre à jour le cache de l'éditeur de liens en utilisant ldconfig. Si cela n'a pas fonctionné, vérifiez les fichiers de configuration de l'éditeur de liens sous /etc/ld.conf.d/ pour voir si le chemin de la bibliothèque est inclus. Si vous avez changé la configuration, n'oubliez pas de mettre à jour le cache à nouveau!

Questions connexes