繁体   English   中英

Makefile:如何正确包含头文件及其目录?

[英]Makefile: How to correctly include header file and its directory?

我有以下生成文件:

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

这个 makefile 和所有三个源文件Lock.cppDBC.cppTrace.cpp都位于名为Core的当前目录中。 其中一个源文件Trace.cpp包含一行,其中包含当前目录之外的头文件:

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

头文件split.h位于当前目录的上一级,然后位于名为StdCUtil的子目录中。 所以这就是我在 makefile 中添加INC_DIR = ../StdCUtil的原因。 整体目录结构如下所示:

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

但是当我成功时,它给了我错误:

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

为什么即使我在 makefile 中指定了INC_DIR也找不到头文件split.h 如何纠正这个?

生成文件中的这些行,

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

和你的 .cpp 文件中的这一行,

#include "StdCUtil/split.h"

处于冲突中。

使用源目录中的 makefile 和-I选项,您应该在源文件中使用#include "split.h" ,并且您的依赖项应该是../StdCUtil/split.h

另外一个选项:

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

有了这个,您的#include指令将保留为#include "StdCUtil/split.h"

另一种选择是将您的 makefile 放在父目录中:

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

使用这种布局,通常将目标文件(可能还有可执行文件)放在与CoreStdCUtil目录平行的子目录中。 Object ,例如。 有了这个,你的makefile就变成了:

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)

预处理器正在寻找StdCUtil/split.h

并在

  • $INC_DIR (即../StdCUtil/ = /root/Core/../StdCUtil/ = /root/StdCUtil/ )。 所以../StdCUtil/ + StdCUtil/split.h = ../StdCUtil/StdCUtil/split.h文件丢失

您可以修复更改$INC_DIR变量的错误(最佳解决方案):

$INC_DIR = ../

或包含指令:

#include "split.h"

但是通过这种方式,您丢失了“路径语法”,这使得头文件所属的命名空间或模块非常清楚。

参考:

编辑/更新

也应该是

CXX = g++
CXXFLAGS = -c -Wall -I$(INC_DIR)

...

%.o: %.cpp $(DEPS)
    $(CXX) -o $@ $< $(CXXFLAGS)

这不是关于 make 的问题,而是关于#include指令的语义的问题。

问题是,路径“../StdCUtil/StdCUtil/split.h”中没有文件。 这是编译器将包含路径“../StdCUtil”与来自#include指令“StdCUtil/split.h”的相对路径组合在一起时产生的路径。

要解决此问题,只需使用-I..而不是-I../StdCUtil

尝试INC_DIR=../ ../StdCUtil

然后,设置CCFLAGS=-c -Wall $(addprefix -I,$(INC_DIR))

编辑:另外,将您的#include修改为#include <StdCUtil/split.h>以便编译器知道使用 -I 而不是使用#include的 .cpp 的本地路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM