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
-
./
(es decir,/root/Core/
, el directorio que contiene la declaración #include ). Entonces./
+StdCUtil/split.h
=./StdCUtil/split.h
y falta el archivo
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
.