makefile相对路径是否与gcc相对路径相同?

我知道这听起来像一个愚蠢的问题,而且确实如此。 我正在尝试编写一个makefile,它构建并链接到我正在编写的静态库(这是一个unit testing框架)。 基本上我无法弄清楚当我使用make时调用gcc的工作目录。

我的目录结构如下所示:

./ |-> src |-> include |-> project |-> Makefile |-> test |-> test.c, test.h |-> project |-> Makefile 

所以,如果我进入test / project目录并键入以下命令,我似乎没有任何问题

 gcc -I../../include -I../../src ../test.c 

但是如果我使用的makefile基本上具有相同的配置(makefile在下面),那么我会得到一个错误:

 gcc -o test ../test.c In file included from ../test.c:7:0: ../test.h:8:24: fatal error: System.h: No such file or directory #include "System.h" 

(System.h是我在include/目录中的头文件之一)。

所以这是我的问题。 由于我正在尝试使用gcc来编译一个与makefile不同的相对路径的文件,该文件包含来自不同的相对路径,使用make执行此操作的正确方法是什么? 我应该将我的工作目录更改为包含test.c的目录,并包含相对于该目录的目录,还是应该将相对路径放到所有内容中,就像我从makefile目录中调用gcc一样?

这是我的makefile

 CC = gcc CFLAGS = -Wall -std=c99 -static -I../../include -I../../src -L$(LIBTARGET) -lmystaticlib TARGET_APP=test LIBTARGET = ../../project all : $(TARGET_APP) $(TARGET_APP) : library $(CC) ${CLAGS} -o $@ ../test.c library : $(MAKE) -C $(LIBTARGET) 

${CLAGS}中用$(CFLAGS)替换${CLAGS} (parens而不是括号,修复变量名中的拼写错误)。 就像现在一样,不使用makefile中的CFLAGS变量。 这就是它的内容没有出现在编译器调用中的原因,这就是../../include不是编译器搜索路径的一部分的原因。

除此之外:除非你做了一些改变它,否则编译器调用的工作目录就是你调用make的目录。 您可以通过放置包含以下内容的makefile来测试它:

 all: pwd 

在目录中,例如/home/user/foo/bar/Makefile 。 然后:

 $ cd /home/user/foo/bar $ make /home/user/foo/bar $ cd .. $ make -f bar/Makefile /home/user/foo