makefile,从不同路径编译文件时出错
makefile, error compiling files from different paths
我有 2 个文件夹,第一个文件夹包含我构建的文件,第二个文件夹包含我应该使用而不更改的文件,所有文件同步和工作,已经通过手动编译测试并合并1 个文件夹,
CC:=g++
COURSE_DIR:=/home/mtm/public/2122b/
HW_DIR:=$(COURSE_DIR)ex2/
OBJS=Card.o Player.o utilities.o Mtmchkin.o test.o
EXEC=mtmchkin_test
DEBUG_FLAG:=-g -DNDEBUG#assign -g for debug, or -DNDEBUG to turnoff assert
HW_FLAG=-I -I$(HW_DIR)
COMP_FLAG=--std=c++11 -Wall -pedantic-errors -Werror $(HW_FLAG)
$(EXEC) : $(OBJS)
$(CC) $(DEBUG_FLAG) $(COMP_FLAG) $(OBJS) -o $@
Card.o : Card.cpp $(HW_DIR)Card.h Player.h $(HW_DIR)utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
Player.o : Player.cpp Player.h $(HW_DIR)utilities.h $(HW_DIR)Card.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
utilities.o : $(HW_DIR)utilities.cpp $(HW_DIR)utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
Mtmchkin.o : Mtmchkin.cpp Mtmchkin.h $(HW_DIR)Card.h Player.h $(HW_DIR)utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
test.o : $(HW_DIR)test.cpp Player.h $(HW_DIR)Card.h Mtmchkin.h $(HW_DIR)utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
clean:
rm -f $(OBJS) $(EXEC)
makefile 在我提到的第一个文件夹中,HW_DIR
是我提到的第二个文件夹的路径,但它没有编译。知道问题是什么以及如何解决吗?
编辑:
这是我从我提到的第一个文件夹中得到的输入,包含 makefile 和输出
[final]$ make
g++ -c -g -DNDEBUG --std=c++11 -Wall -pedantic-errors -Werror -I -I/home/mtm/public/2122b/ex2/ Card.cpp -o Card.o
Card.cpp:1:18: fatal error: Card.h: No such file or directory
#include "Card.h"
^
compilation terminated.
make: *** [Card.o] Error 1
我想让它编译成功,然后把 exec 文件和 makefile 放在同一个文件夹里。
您的问题似乎是:
HW_FLAG=-I -I$(HW_DIR)
这会将包含路径设置为 -I/home/mtm/public/2122b/ex2/
,它(作为相对路径,因为它以 -
开头)将是当前目录下的一个(可能不存在的)目录。
应该是:
HW_FLAG=-I $(HW_DIR)
GCC's command line documentation 表明 -I
可以在其参数前有一个 space。
此外,请确保包含文件所在的所有不同文件夹都在包含路径中表示。如果(看起来)在与 makefile 相同的文件夹中有 .h
个文件,您可以尝试
-I . -I $(HW_DIR)
但是,您可能需要指定 makefile 的完整路径而不是 .
最后,$*
无法用于编译 $(HW_DIR)utilities.cpp
和 $(HW_DIR)test.cpp
,因为它们与目标 utilities.o
和 [=22= 位于不同的目录中]. (documentation link)。只需使用例如$(HW_DIR)\utilities.cpp
明确用于该规则,而不是 $*.cpp
。
我有 2 个文件夹,第一个文件夹包含我构建的文件,第二个文件夹包含我应该使用而不更改的文件,所有文件同步和工作,已经通过手动编译测试并合并1 个文件夹,
CC:=g++
COURSE_DIR:=/home/mtm/public/2122b/
HW_DIR:=$(COURSE_DIR)ex2/
OBJS=Card.o Player.o utilities.o Mtmchkin.o test.o
EXEC=mtmchkin_test
DEBUG_FLAG:=-g -DNDEBUG#assign -g for debug, or -DNDEBUG to turnoff assert
HW_FLAG=-I -I$(HW_DIR)
COMP_FLAG=--std=c++11 -Wall -pedantic-errors -Werror $(HW_FLAG)
$(EXEC) : $(OBJS)
$(CC) $(DEBUG_FLAG) $(COMP_FLAG) $(OBJS) -o $@
Card.o : Card.cpp $(HW_DIR)Card.h Player.h $(HW_DIR)utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
Player.o : Player.cpp Player.h $(HW_DIR)utilities.h $(HW_DIR)Card.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
utilities.o : $(HW_DIR)utilities.cpp $(HW_DIR)utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
Mtmchkin.o : Mtmchkin.cpp Mtmchkin.h $(HW_DIR)Card.h Player.h $(HW_DIR)utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
test.o : $(HW_DIR)test.cpp Player.h $(HW_DIR)Card.h Mtmchkin.h $(HW_DIR)utilities.h
$(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.cpp -o $@
clean:
rm -f $(OBJS) $(EXEC)
makefile 在我提到的第一个文件夹中,HW_DIR
是我提到的第二个文件夹的路径,但它没有编译。知道问题是什么以及如何解决吗?
编辑: 这是我从我提到的第一个文件夹中得到的输入,包含 makefile 和输出
[final]$ make
g++ -c -g -DNDEBUG --std=c++11 -Wall -pedantic-errors -Werror -I -I/home/mtm/public/2122b/ex2/ Card.cpp -o Card.o
Card.cpp:1:18: fatal error: Card.h: No such file or directory
#include "Card.h"
^
compilation terminated.
make: *** [Card.o] Error 1
我想让它编译成功,然后把 exec 文件和 makefile 放在同一个文件夹里。
您的问题似乎是:
HW_FLAG=-I -I$(HW_DIR)
这会将包含路径设置为 -I/home/mtm/public/2122b/ex2/
,它(作为相对路径,因为它以 -
开头)将是当前目录下的一个(可能不存在的)目录。
应该是:
HW_FLAG=-I $(HW_DIR)
GCC's command line documentation 表明 -I
可以在其参数前有一个 space。
此外,请确保包含文件所在的所有不同文件夹都在包含路径中表示。如果(看起来)在与 makefile 相同的文件夹中有 .h
个文件,您可以尝试
-I . -I $(HW_DIR)
但是,您可能需要指定 makefile 的完整路径而不是 .
最后,$*
无法用于编译 $(HW_DIR)utilities.cpp
和 $(HW_DIR)test.cpp
,因为它们与目标 utilities.o
和 [=22= 位于不同的目录中]. (documentation link)。只需使用例如$(HW_DIR)\utilities.cpp
明确用于该规则,而不是 $*.cpp
。