web-dev-qa-db-fra.com

Inclure le fichier d'en-tête dans un répertoire différent de c ++

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!

7
J. Lin

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"

1
abhiarora

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

0
daf