makefile 相对路径是否与 gcc 相对路径相同?
Are makefile relative paths treated the same as gcc relative paths?
我知道这听起来是个愚蠢的问题,确实如此。我正在尝试编写一个 makefile,它构建并链接到我正在编写的静态库(这是一个单元测试框架)。基本上,当我使用 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)
将 makefile 中的 ${CLAGS}
替换为 $(CFLAGS)
(用圆括号代替方括号,修正变量名中的拼写错误)。就像现在一样,未使用 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
我知道这听起来是个愚蠢的问题,确实如此。我正在尝试编写一个 makefile,它构建并链接到我正在编写的静态库(这是一个单元测试框架)。基本上,当我使用 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)
将 makefile 中的 ${CLAGS}
替换为 $(CFLAGS)
(用圆括号代替方括号,修正变量名中的拼写错误)。就像现在一样,未使用 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