【问题标题】:Are makefile relative paths treated the same as gcc relative paths?makefile 相对路径是否与 gcc 相对路径相同?
【发布时间】:2015-01-19 10:39:40
【问题描述】:

我知道这听起来像是一个愚蠢的问题,而且确实如此。我正在尝试编写一个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 一样?

这是我的生成文件

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}

标签: c gcc makefile


【解决方案1】:

将 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

【讨论】:

  • ${CFLAGS}$(CFLAGS) 都是有效的 make 变量扩展。我个人更喜欢$(CFLAGS) 版本,尽可能避免与shell变量混淆。
猜你喜欢
  • 2012-01-11
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 2015-11-13
相关资源
最近更新 更多