为什么我不能使用makefile正确地包含此文件



我的目录结构如下:

root
  |____SG
  |     |
  |     |____Makefile
  |     |____simple_client_main.cpp
  |
  |___EEE
        |___my_utils.h

SG本质上是我构建"simple_client"的操作基础,我正从这里运行make。在simple_client_main.cpp中,我有以下#includes:

#include <iostream>
#include <string>
#include "my_utils.h"

所以我需要我的makefile来知道my_utils.h在哪里。考虑到这一点,我想添加root/EEE目录作为include目录。(从我现在的位置来看,那将是../EEE。)

按照这里的建议,我的makefile看起来是这样的:

DIR1 = ../EEE
CXXFLAGS = $(FLAG)
OBJS = simple_client_main.o
SRCS = simple_client_main.cpp
all: simple_client
simple_client: $(OBJS)
        g++ -o simple_client -I$(DIR1) $(OBJS) -lz
# [...]
depend:
        makedepend -- $(CFLAGS) -- $(SRCS)

但它不起作用:

simple_client_main.cpp:6:25: fatal error: my_utils.h: No such file or directory 
compilation terminated.

注意,如果我在cpp中手动设置#include指令,如下所示:

#include "../EEE/my_utils.h"

一切如预期。

我在这里可能做错了什么?

您需要将-I$(DIR1)添加到CFLAGSCXXFLAGS(或者两者都添加)中,以便在编译对象文件时,该选项出现在编译器命令行中。

您希望make执行类似于的操作

g++ -c -I../EEE simple_client_main.cpp

如果将-I../EEE添加到$(CXXFLAGS)$(CFLAGS),则应该执行此操作。您需要知道您正在使用的make程序所使用的规则——它们可能会有所不同。

链接对象文件时,-I选项的相关性为时已晚(但仍应在链接器命令行中包含$(CFLAGS)$(CXXFLAGS),因为其他选项(尤其是-g)在链接和编译到对象代码时都具有相关性)。

以下是对问题中显示的大纲makefile的一些简单修改。

DIR1     = ../EEE
IFLAGS   = -I$(DIR1)
CXXFLAGS = $(FLAG) $(IFLAGS)
CFLAGS   = $(IFLAGS)
LDFLAGS  =
LDLIBS   = -lz
CXX      = g++
OBJS = simple_client_main.o
SRCS = simple_client_main.cpp
all: simple_client
simple_client: $(OBJS)
        $(CXX) -o $@ $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS)

像这样的makefile正常工作的几率很小。不清楚你可以在FLAG宏中放什么,所以我把它留下了。(我用UFLAGSUXXFLAGS表示"用户定义的C(或C++)标志";它们可以在命令行上设置,而不会由makefile设置,而是包含在CFLAGSCXXFLAGS中——您可能在追求类似的东西。)

请注意链接线几乎是所有宏。这是正常和可取的;在不编辑makefile的情况下运行make时可以更改宏,但在不编辑makefile的情况下无法更改常量文本。C和C++编译器的-c-o选项是所有应该以纯文本形式出现的选项。

如果仍然存在问题,请查看用于将C++源代码编译为对象文件的内置规则,并相应地调整定义。(你可以使用make -p打印规则——你可能需要它来了解发生了什么,但我希望不是为了你,因为它们往往很复杂。使用make -f /dev/null -p只显示内置规则;这也很有用。)

注意,make depend规则可能需要一些手术。它使用CCD_ 30。如果$(CXXFLAGS)包含makedepend命令所需的额外选项,则您可能需要该选项,甚至也需要该选项。如果只有C++源代码,则可能只需要命令行中的$(CXXFLAGS)宏。

错误来自编译阶段还是makedependent阶段?

因为我在上面看到的是makedependent使用$(CFLAGS),而您还没有将-I$(DIR1)放入CFLAGS中。

最新更新