que incluir generador dev crear cabecera archivos archivo c++ c makefile

c++ - generador - Makefile: ¿Cómo incluir correctamente el archivo de encabezado y su directorio?



incluir header en c (4)

El preprocesador está buscando StdCUtil/split.h en

y en

  • $INC_DIR (es decir, ../StdCUtil/ = /root/Core/../StdCUtil/ = /root/StdCUtil/ ). Entonces ../StdCUtil/ + StdCUtil/split.h = ../StdCUtil/StdCUtil/split.h y falta el archivo

Puede corregir el error cambiando la variable $INC_DIR (la mejor solución):

$INC_DIR = ../

o la directiva de inclusión:

#include "split.h"

pero de esta manera perdió la "sintaxis de ruta" que deja muy claro a qué espacio de nombres o módulo pertenece el archivo de encabezado.

Referencia:

EDITAR / ACTUALIZAR

También debería ser

CXX = g++ CXXFLAGS = -c -Wall -I$(INC_DIR) ... %.o: %.cpp $(DEPS) $(CXX) -o $@ $< $(CXXFLAGS)

Tengo el siguiente makefile:

CC=g++ INC_DIR = ../StdCUtil CFLAGS=-c -Wall -I$(INC_DIR) DEPS = split.h all: Lock.o DBC.o Trace.o %.o: %.cpp $(DEPS) $(CC) -o $@ $< $(CFLAGS) clean: rm -rf *o all

Este archivo make y los tres archivos de origen Lock.cpp , DBC.cpp , Trace.cpp están ubicados en el directorio actual llamado Core . Uno de los archivos de origen Trace.cpp contiene una línea que incluye un archivo de encabezado fuera del directorio actual:

//in Trace.cpp #include "StdCUtil/split.h"

El archivo de encabezado split.h se encuentra en un nivel por encima del directorio actual y luego en el subdirectorio llamado StdCUtil . Entonces es por eso que agregué INC_DIR = ../StdCUtil en el makefile. La estructura general del directorio es similar a la siguiente:

root |___Core | | | |____Makefile | |____DBC.cpp | |____Lock.cpp | |____Trace.cpp | |___StdCUtil |___split.h

Pero cuando lo hago, me da el error:

Trace.cpp:8:28: fatal error: StdCUtil/split.h: No such file or directory #include "StdCUtil/split.h" ^ compilation terminated. <builtin>: recipe for target ''Trace.o'' failed

¿Por qué esto no encuentra el archivo de encabezado split.h incluso si especifico el INC_DIR en el makefile? ¿Cómo corregir esto?


Esta no es una pregunta sobre make, es una pregunta sobre la semántica de la directiva #include .

El problema es que no hay ningún archivo en la ruta "../StdCUtil/StdCUtil/split.h". Esta es la ruta que se obtiene cuando el compilador combina la ruta de inclusión "../StdCUtil" con la ruta relativa de la directiva #include "StdCUtil / split.h".

Para solucionar esto, simplemente use -I.. lugar de -I../StdCUtil .


Estas lineas en tu makefile,

INC_DIR = ../StdCUtil CFLAGS=-c -Wall -I$(INC_DIR) DEPS = split.h

y esta linea en tu archivo .cpp,

#include "StdCUtil/split.h"

estan en conflicto

Con su makefile en su directorio de origen y con esa opción -I debería usar #include "split.h" in your source file, and your dependency should be ../ StdCUtil / split.h`.

Otra opción:

INC_DIR = ../StdCUtil CFLAGS=-c -Wall -I$(INC_DIR)/.. # Ugly! DEPS = $(INC_DIR)/split.h

Con esto, su directiva #include permanecería como #include "StdCUtil/split.h" .

Otra opción más es colocar su makefile en el directorio principal:

root |____Makefile | |___Core | |____DBC.cpp | |____Lock.cpp | |____Trace.cpp | |___StdCUtil |___split.h

Con este diseño, es común colocar los archivos de objetos (y posiblemente el ejecutable) en un subdirectorio que es paralelo a sus directorios Core y StdCUtil . Object , por ejemplo. Con esto, tu makefile se convierte en:

INC_DIR = StdCUtil SRC_DIR = Core OBJ_DIR = Object CFLAGS = -c -Wall -I. SRCS = $(SRC_DIR)/Lock.cpp $(SRC_DIR)/DBC.cpp $(SRC_DIR)/Trace.cpp OBJS = $(OBJ_DIR)/Lock.o $(OBJ_DIR)/DBC.o $(OBJ_DIR)/Trace.o # Note: The above will soon get unwieldy. # The wildcard and patsubt commands will come to your rescue. DEPS = $(INC_DIR)/split.h # Note: The above will soon get unwieldy. # You will soon want to use an automatic dependency generator. all: $(OBJS) $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(CC) $(CFLAGS) -c $< -o $@ $(OBJ_DIR)/Trace.o: $(DEPS)


Prueba INC_DIR=../ ../StdCUtil .

Luego, establezca CCFLAGS=-c -Wall $(addprefix -I,$(INC_DIR))

EDITAR: También, modifique su #include para que sea #include <StdCUtil/split.h> para que el compilador sepa usar -I en lugar de la ruta local de .cpp usando #include .