Ich habe C++ gelernt und bin auf folgende Frage gestoßen: Ich habe eine Verzeichnisstruktur wie:
- current directory
- Makefile
- include
- header.h
- src
- main.cpp
meine header.h:
#include <iostream>
using namespace std;
void print_hello();
meine main.cpp:
#include "header.h"
int main(int argc, char const *argv[])
{
print_hello();
return 0;
}
void print_hello()
{
cout<<"hello world"<<endl;
}
mein Makefile:
CC = g++
OBJ = main.o
HEADER = include/header.h
CFLAGS = -c -Wall
hello: $(OBJ)
$(CC) $(OBJ) -o [email protected]
main.o: src/main.cpp $(HEADER)
$(CC) $(CFLAGS) $< -o [email protected]
clean:
rm -rf *o hello
Und die Ausgabe von make ist:
g ++ -c -Wall src/main.cpp -o main.o src/main.cpp: 1: 20: schwerwiegender Fehler: header.h: Keine solche Datei oder Verzeichnis Kompilierung beendet . Makefile: 10: Rezept für Ziel 'main.o' fehlgeschlagen make: *** [main.o] Fehler 1
Welche Fehler habe ich hier gemacht. Es ist frustrierend. Wirklich schätzen alle Ratschläge!
Sie haben dem Makefile mitgeteilt, dass include/header.h
vorhanden sein muss, und Sie haben der C++ - Quelldatei mitgeteilt, dass sie header.h
… benötigt, aber Sie haben dem Compiler nicht mitgeteilt, wo sich diese Header befinden (d. H. Im Verzeichnis "include").
Mach das:
CFLAGS = -c -Wall -Iinclude
Sie können entweder die Option -I
zur Befehlszeile hinzufügen, um den Compiler anzuweisen, dort nach Header-Dateien zu suchen. Wenn Sie Header-Dateien im include/
-Verzeichnis haben, sollte dieser Befehl für Sie funktionieren.
gcc -Iinclude/
Da Sie makefile
verwenden, können Sie diese Option in das Makro CFLAGS
in Ihr Makefile aufnehmen.
CFLAGS = -Iinclude/ -c -Wall
OR
Sie können Header-Dateien mit #include "../include/header.h"
einschließen.
Vielleicht ändern Sie Ihre Include-Zeile:
#include "include/header.h"
Angenommen, dort ist Ihre Kopfzeile - Ich mache diese Annahme aus Ihrem Makefile