J'ai appris le c ++ et ai rencontré la question suivante: J'ai une structure de répertoire comme:
- current directory
- Makefile
- include
- header.h
- src
- main.cpp
mon en-tête.h:
#include <iostream>
using namespace std;
void print_hello();
mon main.cpp:
#include "header.h"
int main(int argc, char const *argv[])
{
print_hello();
return 0;
}
void print_hello()
{
cout<<"hello world"<<endl;
}
mon Makefile:
CC = g++
OBJ = main.o
HEADER = include/header.h
CFLAGS = -c -Wall
hello: $(OBJ)
$(CC) $(OBJ) -o $@
main.o: src/main.cpp $(HEADER)
$(CC) $(CFLAGS) $< -o $@
clean:
rm -rf *o hello
Et le résultat de make est:
g ++ -c -Wall src/main.cpp -o main.o src/main.cpp: 1: 20: erreur fatale: header.h: aucun fichier ou répertoire de ce type compilation terminée . Makefile: 10: la recette pour la cible 'main.o' a échoué make: *** [main.o] Erreur 1
Quelles erreurs j'ai commis ici. C'est frustrant. Vraiment apprécier tout conseil!
Vous avez dit au Makefile que include/header.h
doit être présent et au fichier source C++ qu’il a besoin de header.h
… mais vous n’avez pas indiqué au compilateur où ces en-têtes résident (c.-à-d. Dans le répertoire "include").
Faire ceci:
CFLAGS = -c -Wall -Iinclude
Vous pouvez soit ajouter une option -I
à la ligne de commande pour indiquer au compilateur d'y rechercher des fichiers d'en-tête. Si vous avez des fichiers d'en-tête dans le répertoire include/
, cette commande devrait fonctionner pour vous.
gcc -Iinclude/
Puisque vous utilisez makefile
, vous pouvez inclure cette option dans la macro CFLAGS
dans votre fichier makefile.
CFLAGS = -Iinclude/ -c -Wall
OR
Vous pouvez inclure des fichiers d'en-tête à l'aide de #include "../include/header.h"
.
Peut-être changer votre ligne d'inclusion:
#include "include/header.h"
En supposant que votre en-tête existe - je fais cette hypothèse à partir de votre makefile