2010-11-25 20 views
1

Hier ist meine Makefile:Wie löst man dieses Verknüpfungsproblem in 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) 

Es ist klar definiert, wie mein Projekt organisiert ist, also werde ich es nicht erklären. Es läßt sich ohne Probleme, aber auf binäre Ausführung $(BIN_DIR)/$(MAIN) der folgende Fehler angezeigt:

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

Welche Bibliothek ist rintf gehören? Ich habe versucht, auch -lc zu verbinden, aber das löst das Problem nicht.

Ist etwas falsch mit meinem Makefile? Oder sollte ich etwas extra mit $(MAIN) verknüpfen?

Vielen Dank im Voraus für Ihre Antworten.

Antwort

3

Sie sollten im Wesentlichen nie ein Programm verknüpfen, indem Sie direkt ld aufrufen; Verwenden Sie Ihren Compiler immer zum Verknüpfen. Es übergibt alle möglichen zusätzlichen Argumente an ld, damit die Dinge funktionieren. Ersetzen Sie die $(LD) durch $(CC). Tun Sie das, unabhängig davon, ob es Ihr Problem tatsächlich behebt oder nicht.

'Es ist seltsam, dass Sie nicht den Namen des freigegebenen Objekts erhalten, das in der Fehlermeldung angegeben ist.

Diese Handbuchseite für rintf() zeigt an, dass es in <math.h> deklariert ist; Am wahrscheinlichsten müssen Sie die Mathematikbibliothek der Verbindungslinie hinzufügen: -lm.

Ich würde einige Ihrer Make-Datei neu zu schreiben:

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

... 

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

+1. Außerdem ist die 'all: $ (MAIN) exec'-Regel unklug; Make verspricht nicht, die Voraussetzungen eines Ziels in der Reihenfolge von links nach rechts zu erstellen. Besser: 'all: exec' und' exec: $ (MAIN) '. – Beta

+0

@Beta: Ja, du hast Recht. Persönlich mag ich Makefiles nicht besonders, die Programme automatisch ausführen, die gebaut worden sind, aber das könnte ein altes fogy Denken sein. Es hängt, teilweise, davon ab, was die Ausführung tut, nehme ich an; Unit-Test oder Regressionstest macht Sinn - und das ist wahrscheinlich, was es hier ist. Und ich habe viele Gegenbeispiele aus der Arbeit im Büro. –

1

Normalerweise wird dieser Fehler angezeigt, wenn der Linker nicht in der Lage ist, das benötigte gemeinsame Objekt (.so-Datei) zu finden. Ich nehme Linux-Plattform an.

In einem Linux-Betriebssystem können Sie mithilfe der folgenden Datei nach der Datei suchen: find oder locate. Versuchen Sie, den Linker-Cache zu aktualisieren, indem Sie ldconfig verwenden, wenn Sie die .so-Datei finden können. Wenn es nicht funktionierte, überprüfen Sie die Linker-Konfigurationsdateien unter /etc/ld.conf.d/, um festzustellen, ob der Bibliothekspfad enthalten ist. Wenn Sie die Konfiguration geändert haben, vergessen Sie nicht, den Cache erneut zu aktualisieren!