makefile 没有规则可以创建main.o需要的目标xxx.h

beastsam 2018-10-24 08:27:27
新手小白一枚,最近在学如何写makefile,想学习一下makefile编译多文件夹内容的写法。
objects = main.o xxx.o
vpath = %.h include
vpath = %.c src:test

run:$(objects)
gcc -g -Wall -o run $(objects)

main.o:xxx.h
xxx.o:xxx.h

.phony:clean
clean:
rm -f run ($)objects

本人在运行时如果将所有文件放在一个文件夹,那么编译没问题,但是如果分别放到如上三个文件夹时,make就会提示:没有规则可以创建main.o需要的目标xxx.h,哪位大神知道这是什么情况。
makefile放在和include,test,src同级的目录下
...全文
1719 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
beastsam 2018-11-03
  • 打赏
  • 举报
回复
引用 6 楼 mxgsgtc 的回复:
引用 5 楼 u011403848 的回复:
[quote=引用 4 楼 mxgsgtc 的回复:]
[quote=引用 2 楼 u011403848 的回复:]
[quote=引用 1 楼 mxgsgtc 的回复:]
make -c <文件夹>
可是我用的vpath变量用的不对么?这个不是已经把文件夹加进去了么

你的问题在于 vpath的写法有问题,去掉"="号就好了
vpath %.h include
vpath %.c src:test[/quote]

去掉等号还是不行,不过我把main.c里和xxx.c里把#include "xxx.h" 改为#include "../include/xxx.h"就可以make了,不过现在我还是没弄懂为啥我用vpath和VPATH就不行[/quote]

因为对于makefile来说vpath是搜索目标和依赖文件的路径,但是对于命令gcc来说是无效的,也就是说

在执行gcc时不会自动从VPATH 或者vpath中自动搜索要包含的头文件等信息文件

此时要用到了 -I 或者--incude + 路径, 所以如果xxx.c里与main.c里是#include "xxx.h"的话, Makefile如下:

objects = main.o xxx.o
vpath = %.h include
vpath = %.c src:test

CPPFLAGS = -I include

run:$(objects)
gcc -g $(CPPFLAGS ) -Wall -o run $(objects)

main.o:xxx.h
xxx.o:xxx.h

.phony:clean
clean:
rm -f run ($)objects


[/quote]


那可是为啥我把main.c和xxx.c里的 #include "./include/xxx.h"改为 #include "xxx.h",makefile用你写的这个为啥make的时候还是报错找不到xxx.h?
loe 2018-10-27
  • 打赏
  • 举报
回复
引用 5 楼 u011403848 的回复:
引用 4 楼 mxgsgtc 的回复:
[quote=引用 2 楼 u011403848 的回复:] [quote=引用 1 楼 mxgsgtc 的回复:] make -c <文件夹>
可是我用的vpath变量用的不对么?这个不是已经把文件夹加进去了么
你的问题在于 vpath的写法有问题,去掉"="号就好了 vpath %.h include vpath %.c src:test[/quote] 去掉等号还是不行,不过我把main.c里和xxx.c里把#include "xxx.h" 改为#include "../include/xxx.h"就可以make了,不过现在我还是没弄懂为啥我用vpath和VPATH就不行[/quote] 因为对于makefile来说vpath是搜索目标和依赖文件的路径,但是对于命令gcc来说是无效的,也就是说 在执行gcc时不会自动从VPATH 或者vpath中自动搜索要包含的头文件等信息文件 此时要用到了 -I 或者--incude + 路径, 所以如果xxx.c里与main.c里是#include "xxx.h"的话, Makefile如下: objects = main.o xxx.o vpath = %.h include vpath = %.c src:test CPPFLAGS = -I include run:$(objects) gcc -g $(CPPFLAGS ) -Wall -o run $(objects) main.o:xxx.h xxx.o:xxx.h .phony:clean clean: rm -f run ($)objects
beastsam 2018-10-26
  • 打赏
  • 举报
回复
引用 4 楼 mxgsgtc 的回复:
引用 2 楼 u011403848 的回复:
[quote=引用 1 楼 mxgsgtc 的回复:]
make -c <文件夹>
可是我用的vpath变量用的不对么?这个不是已经把文件夹加进去了么

你的问题在于 vpath的写法有问题,去掉"="号就好了
vpath %.h include
vpath %.c src:test[/quote]

去掉等号还是不行,不过我把main.c里和xxx.c里把#include "xxx.h" 改为#include "../include/xxx.h"就可以make了,不过现在我还是没弄懂为啥我用vpath和VPATH就不行
loe 2018-10-25
  • 打赏
  • 举报
回复
引用 2 楼 u011403848 的回复:
引用 1 楼 mxgsgtc 的回复:
make -c <文件夹>
可是我用的vpath变量用的不对么?这个不是已经把文件夹加进去了么
你的问题在于 vpath的写法有问题,去掉"="号就好了 vpath %.h include vpath %.c src:test
loe 2018-10-25
  • 打赏
  • 举报
回复
■目录结构: include |-test.h src |-main.c test |-test.c Makefile ■ 内容 test.h: extern void test1(); extern void test2(); ------------------------------------- main.c: #include <stdio.h> #include <stdlib.h> #include "../include/test.h" int main() { test1(); test2(); return 0; } ------------------------------------------- test.c: #include <stdio.h> #include <string.h> void test1() { printf("test1\n"); } void test2() { printf("test2\n"); } ---------------------- Makefile: vpath %.h include vpath %.c src:test CPPFLAGS = -I include SOURCES = \ main.c \ test.c OBJECTS = $(subst .c,.o,$(SOURCES)) run: $(OBJECTS) gcc -g -Wall -o run $(OBJECTS) clean: rm *.exe *.o *.d
beastsam 2018-10-25
  • 打赏
  • 举报
回复
引用 1 楼 mxgsgtc 的回复:
make -c <文件夹>
可是我用的vpath变量用的不对么?这个不是已经把文件夹加进去了么
loe 2018-10-25
  • 打赏
  • 举报
回复
make -c <文件夹>

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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