我的目录结构如下:
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)
添加到CFLAGS
或CXXFLAGS
(或者两者都添加)中,以便在编译对象文件时,该选项出现在编译器命令行中。
您希望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
宏中放什么,所以我把它留下了。(我用UFLAGS
和UXXFLAGS
表示"用户定义的C(或C++)标志";它们可以在命令行上设置,而不会由makefile
设置,而是包含在CFLAGS
或CXXFLAGS
中——您可能在追求类似的东西。)
请注意链接线几乎是所有宏。这是正常和可取的;在不编辑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
中。