Makefile无法找到头文件

SongXiong4 2015-08-30 10:16:33
菜鸟最近在学习写makefile文件,遇到了一个小问题,但是一直没有找到解决方案,所以希望得到大家的帮忙~~

开发环境:Fedora 14(Kerne版本为2.6l)下使用GNU编译

工程目录:testMakefile,下面包含三个目录:build(包含Makefile文件),src(包含源文件testMakefile.c)和inc(包含头文件testMake.h)。

其中build目录下的Makefile文件内容为:
CC = gcc
CFLAGS = -g -Wall

CUR_DIR = $(shell pwd)
TOP_DIR = $(CUR_DIR)/..
SRC_DIR = $(TOP_DIR)/src
INC_DIR = -I$(TOP_DIR)/inc

main: testMakefile.o
$(CC) -o main testMakefile.o

testMakefile.o: $(INC_DIR)/testMakefile.h
$(CC) -c $(SRC_DIR)/testMakefile.c

src目录下的testMakefile.c文件内容为:
#include "testMakefile.h"

int main(void)
{
int i;
for (i = 0; i < MAX_NUM; i++)
{
printf("Hello world!\n");
}
return 0;
}

inc目录下的testMakefile.h头文件内容为:
#include <stdlib.h>
#include <stdio.h>

#define MAX_NUM 10


但是,在Linux下执行make指令的时候总是提示无法找到头文件:


然后,我在Makefile文件中头文件目录那里改为:
INC_DIR = -I$(TOP_DIR)/inc
,这时错误又变成了:


请问各位,这是什么原因呢?在网上找资料找了很久都没有找到究竟是什么原因导致的, 知道原因的朋友能跟我解释一下吗?
...全文
1066 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
SongXiong4 2015-08-30
  • 打赏
  • 举报
回复
引用 2 楼 iyomumx 的回复:
INC_DIR = -I$(TOP_DIR)/inc 语义上来说,INC_DIR是一个路径,那么-I不应该出现
您好,在生成testMakefile.o的规则里面,我在INC_DIR这个变量后面添加了头文件名称,所以在规则里面应该不是一个路径而是具体的头文件名了。而且,如果不添加-I这个参数的话,就会提示说无法找到testMakefile.h这个错误。
SongXiong4 2015-08-30
  • 打赏
  • 举报
回复
引用 1 楼 walkiz 的回复:
看起来像是testMakefile.o的路径配置的不对。
您好,我仔细看了一下,好像没什么不妥呀。您可以详细解释一下吗?
iyomumx 2015-08-30
  • 打赏
  • 举报
回复
INC_DIR = -I$(TOP_DIR)/inc 语义上来说,INC_DIR是一个路径,那么-I不应该出现
宋寒松 2015-08-30
  • 打赏
  • 举报
回复
看起来像是testMakefile.o的路径配置的不对。
宋寒松 2015-08-30
  • 打赏
  • 举报
回复
你的理解是正确的。
引用 6 楼 u012280294 的回复:
[quote=引用 5 楼 walkiz 的回复:] 你这样试试看,同时注意一下()和{}括号:

CC = gcc
CFLAGS = -g -Wall

CUR_DIR = $(shell pwd)
TOP_DIR = $(CUR_DIR)/..
SRC_DIR = $(TOP_DIR)/src
INC_DIR = $(TOP_DIR)/inc

main: testMakefile.o
	$(CC) -o main testMakefile.o

testMakefile.o: ${INC_DIR}/testMakefile.h
	$(CC) -c ${SRC_DIR}/testMakefile.c -I${DIR_INC}
[quote=引用 3 楼 u012280294 的回复:] [quote=引用 1 楼 walkiz 的回复:] 看起来像是testMakefile.o的路径配置的不对。
您好,我仔细看了一下,好像没什么不妥呀。您可以详细解释一下吗?[/quote][/quote] 谢谢您,按照您提供的方式可以正常地进行编译生成可执行文件。 我想了一下,下面是我的理解,请您指出是否正确: 是不是因为在我原来的写法中:
testMakefile.o: $(INC_DIR)/testMakefile.h
    $(CC) -c $(SRC_DIR)/testMakefile.c
将头文件写在了生成规则那一行,但是写在这一行并不能让gcc编译的时候定位到那一个头文件,所以,应该在gcc编译的指令后面明确给出头文件路径,也就是将 -I$(INC_DIR)/inc添加到gcc指令那一行。 另外,关于$()和${}的区别,好像$()是优先执行()里面的命令,而${}则是用{}将其中的变量名引用,但是在《GNU make中文手册》的变量这一章中说在引用变量时这两种写法都可以……[/quote]
SongXiong4 2015-08-30
  • 打赏
  • 举报
回复
引用 5 楼 walkiz 的回复:
你这样试试看,同时注意一下()和{}括号:

CC = gcc
CFLAGS = -g -Wall

CUR_DIR = $(shell pwd)
TOP_DIR = $(CUR_DIR)/..
SRC_DIR = $(TOP_DIR)/src
INC_DIR = $(TOP_DIR)/inc

main: testMakefile.o
	$(CC) -o main testMakefile.o

testMakefile.o: ${INC_DIR}/testMakefile.h
	$(CC) -c ${SRC_DIR}/testMakefile.c -I${DIR_INC}
[quote=引用 3 楼 u012280294 的回复:] [quote=引用 1 楼 walkiz 的回复:] 看起来像是testMakefile.o的路径配置的不对。
您好,我仔细看了一下,好像没什么不妥呀。您可以详细解释一下吗?[/quote][/quote] 谢谢您,按照您提供的方式可以正常地进行编译生成可执行文件。 我想了一下,下面是我的理解,请您指出是否正确: 是不是因为在我原来的写法中:
testMakefile.o: $(INC_DIR)/testMakefile.h
    $(CC) -c $(SRC_DIR)/testMakefile.c
将头文件写在了生成规则那一行,但是写在这一行并不能让gcc编译的时候定位到那一个头文件,所以,应该在gcc编译的指令后面明确给出头文件路径,也就是将 -I$(INC_DIR)/inc添加到gcc指令那一行。 另外,关于$()和${}的区别,好像$()是优先执行()里面的命令,而${}则是用{}将其中的变量名引用,但是在《GNU make中文手册》的变量这一章中说在引用变量时这两种写法都可以……
宋寒松 2015-08-30
  • 打赏
  • 举报
回复
你这样试试看,同时注意一下()和{}括号:

CC = gcc
CFLAGS = -g -Wall

CUR_DIR = $(shell pwd)
TOP_DIR = $(CUR_DIR)/..
SRC_DIR = $(TOP_DIR)/src
INC_DIR = $(TOP_DIR)/inc

main: testMakefile.o
	$(CC) -o main testMakefile.o

testMakefile.o: ${INC_DIR}/testMakefile.h
	$(CC) -c ${SRC_DIR}/testMakefile.c -I${DIR_INC}
引用 3 楼 u012280294 的回复:
[quote=引用 1 楼 walkiz 的回复:] 看起来像是testMakefile.o的路径配置的不对。
您好,我仔细看了一下,好像没什么不妥呀。您可以详细解释一下吗?[/quote]

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧