wie makefile mit iostream, string und ifstream Bibliothek
Ich versuche zu bauen, ein makefile für eine Anwendung, in der die lib string iostream und fstream sind.das habe ich bis jetzt
CPP = gcc
LIB_DIR = ./incl
PROGRAMS = test
PROGS_O = action_rec.o
CPPFLAGS = -I$(LIB_DIR) -pg -g
VPATH = ./src/
OBJFILES = $(VPATH)$(patsubst %.cpp,%.o,$(wildcard *.cpp))
LIBS = -02 -liostream -lfstream -lstdlib -lstring
wenn ich versuche, mit meinem makefile bekomme ich als Ergebnis, dass alles, was benötigen die lib-string fstream sind und iostream wurde nicht deklariert, während alles, was, die brauchen die lib stdlib funktioniert.
kann mir jemand sagen warum?
danke
- sind Sie sicher, dass die LIBS übergebene variable im compiler?
- Sie müssen
#include <iostream>
in der Quell-Datei, die es braucht. Darf nicht passieren, dass als linker Argumente, Sie sind nicht die Bibliotheken. (Es sei denn, du bist mit etwas nicht-standard -)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, alle -lstring -stdlib -liostream -lfstream und sehen, ob es behebt es.
Und kompilieren mit g++ so findet er andere Dinge, die es braucht, um link C++ - code.
iostream
ist nicht in der libc; es ist normalerweise in einer Bibliothek, die mit dem compiler (libstdc++
) im Fall vongcc
. Aber wenn Sie einen link mitg++
, wird es diese automatisch.Dort sind zwei getrennte Probleme hier.
Der C++ - Seite:
Verwenden Sie nicht die
gcc
binary für C++ - code kompilieren - Verwendungg++
statt. Dies wird ziehen Sie alle benötigten standard-include-Pfade und-Bibliotheken automatisch.Makefile-Seite:
Ihre Makefile hat eine Reihe von Fragen:
Nicht
CPP
zu einem compiler, diese variable definiert den Präprozessor zu verwenden. VerwendenCXX
zu definieren, der vom compiler so geschieht dies meistens, um definiert werden zug++
sowieso.Nicht Programme erstellen mit dem Namen
test
. Dies geschieht zum Zusammenstoß mit einem standard-Unix-Programm (/usr/bin/test
) und wenn Sie nicht zahlen Aufmerksamkeit, die Sie könnten am Ende ruft das falsche Programm.Don ' T pass
-02
als die linker-flags überLIBS
. Dieser Schalter ist a) falsch formuliert (es sollte-O2
, der Buchstabe O, keine null) und b) ist es ein compiler flag, so sollte es sein, Teil derCXXFLAGS
.Chancen sind, dass Sie nicht brauchen ein Makefile an alle. Das make-Programm kommt mit Standard-Makefiles so oft Sie können einfach erstellen Sie eine
main.cpp
Datei und führen Sie dannDiese wird automatisch kompilieren und verknüpfen
main.cpp
in einemain
ausführbare Datei. In deinem Fall, so etwas wieAusreichend sein.
Das offensichtliche problem ist, dass Sie die Verknüpfung mit
gcc
eher alsg++
.gcc
nicht link gegen die C++ standard-Bibliothek. Sie können es hinzufügenmanuell, aber die einfachste ist einfach zu verwenden
g++
für alles (es sei denn,Sie haben die eigentliche C-code;
g++
wird der compiler Dateien mit der Endung.c
alsC++).
LIBS = -02 -liostream -lfstream -lstdlib -lstring
vereinfacht werden kann eine Menge. Verwenden Sie einfachLIBS = -O2
(ich denke das meintest du -O2 anstatt -02.) In der Tat, Sie wirklich sollte nicht sein, vorbei an einem-O
Flagge auf der link-Phase an alle. Optimierung ist eine Compilezeit-option, die nicht eine link-option.-O2
sollten lieber gehen inCPPFLAGS
dann in LIBS.CXXFLAGS
.