【发布时间】:2014-08-20 20:51:51
【问题描述】:
我的项目目录结构如下:
drwxr-xr-x+ 1 account Domain Users 0 Aug 20 16:16 ./
drwxr-xr-x+ 1 account Domain Users 0 Aug 20 08:48 ../
drwxr-xr-x+ 1 account Domain Users 0 Aug 20 10:55 include/
-rw-r--r-- 1 account Domain Users 597 Aug 20 16:16 Makefile
drwxr-xr-x+ 1 account Domain Users 0 Aug 20 10:55 obj/
drwxr-xr-x+ 1 account Domain Users 0 Aug 20 10:55 src/
在 src 文件夹中:main.cpp foo.cpp bar.cpp
在包含文件夹中:foo.h bar.h
当我运行以下 Makefile 时,会在项目目录中创建目标文件,而不是像我对 Makefile 所期望的那样:obj 目录:
1 ODIR = obj
2 SDIR = src
3 IDIR = include
4
5 _OBJS = main.o foo.o bar.o
6 OBJS = $(patsubst %,$(ODIR)/%,$(_OBJS))
7
8 CC = g++
9
10 CFLAGS = -w
11
12 PROG = program
13
14 #VPATH = src:include:obj:../src:../include:../obj
15
16 all: $(OBJS)
17 $(CC) $(CFLAGS) -I$(IDIR) $(OBJS) -o $(PROG)
18
19 $(ODIR)/main.o: $(SDIR)/main.cpp $(IDIR)/foo.h $(IDIR)/bar.h
20 $(CC) $(CFLAGS) -I$(IDIR) -c $(SDIR)/main.cpp
21
22 $(ODIR)/foo.o: $(SDIR)/foo.cpp $(IDIR)/foo.h
23 $(CC) $(CFLAGS) -I$(IDIR) -c $(SDIR)/foo.cpp
24
25 $(ODIR)/bar.o: $(SDIR)/bar.cpp $(IDIR)/bar.h
26 $(CC) $(CFLAGS) -I$(IDIR) -c $(SDIR)/bar.cpp
27
28 clean:
29 rm -f $(PROG) $(OBJS)
有人能告诉我为什么会这样吗?我的链接器看不到目标文件,因为它认为这些文件位于 obj 目录中。
【问题讨论】:
-
-o $@似乎从您的每个 .o 规则的标志中丢失。如$(CC) $(CFLAGS) -I$(IDIR) -c -o $@ $(SDIR)/main.cpp。有关其他方便的变量,请参阅 Automatic variables in Gnu make。 -
试试remake
-x -
在您遵循@WhozCraig 的建议(应该作为答案)之后,您可以将三个对象规则(
$(ODIR)/main.o、$(ODIR)/foo.o和$(ODIR)/bar.o)合并为一个规则。跨度> -
@WhozCraig 谢谢!这行得通!你能把它变成一个答案,以便我接受吗?并为其他新手详细说明(%@ 包含整个路径+文件,而省略它意味着只是文件)
-
@Beta 我如何将它们合并为一个规则?它们有不同的依赖关系,main 依赖于 [foo.h, bar.h],foo 依赖于 [foo.h],bar 依赖于 [bar.h]。 (如您所见,我对不使用 IDE 的自编译还是很陌生,像这样的东西让我很困惑)