【发布时间】:2012-10-16 10:23:27
【问题描述】:
所以,我正在尝试理解 makefile。目前我有一个项目,其中包含一些模块,它们或多或少相互不依赖。
我的目录树是这样的:
root/
- Source/ <-- referenced as $(INPUTPATH)
- Build/ <-- referenced as $(BUILDPATH)
- Release/ <-- referenced as $(OUTPUTPATH)
- Makefile
我想在 Source/ 上拥有源代码 (.cpp/.h),在 Build/ 上拥有对象,在 Release/* 上拥有可执行文件。
所以,我的想法是有几个不同的目标,并像这样使用它们:
all: maps auxiliars methods
@echo "linking...";\
$(CC) $(CFLAGS) $(OBJS) $(CLIBS) -o ${OUTPUTPATH}/MainProgram
dependency1: $(INPUTPATH)/foo.cpp
@echo "compiling ArbPrecision...";\
cd ${BUILDPATH};\
$(CC) $(CFLAGS) $(CINCLUDE) -c ../$?
dependency2: dependency1 $(INPUTPATH)/bar.cpp
@echo "compiling saddleConstructor...";\
cd ${BUILDPATH};\
$(CC) $(CFLAGS) $(CINCLUDE) -c ../$(INPUTPATH)/bar.cpp
maps: dependency2 $(INPUTPATH)/*Map.cpp
@echo "compiling maps...";\
cd ${BUILDPATH};\
$(CC) $(CFLAGS) $(CINCLUDE) -c ../$(INPUTPATH)/*Map.cpp
... (auxiliars and methods)
$CINCLUDE 和 CFLAGS 只是编译器的东西,比如头文件和外部库。
一切工作几乎完美:在每个目标上,它都要求其他目标的依赖关系,以及源上的 *cpp。如果它不存在,它会调用目标并编译 *cpp。可执行文件的创建没有错误。
但是,如果我两次调用“make”,那么第一次和第二次编译所需的时间是相同的,即使我没有对源代码进行任何更改。所以,显然,我没有正确放置依赖项。
谁能指出我执行此编译的正确方向?我做错了什么,我不明白它是什么。
谢谢, 豪尔赫
【问题讨论】:
-
编译时,输入是源文件(即 .cpp 文件),输出是目标文件(通常是 .o 或 .obj 文件)。那是你应该依赖的地方。你应该说 bar.o 依赖于 bar.cpp 等。同样的链接步骤,你的程序依赖于一堆目标文件,所以它们应该放在
all的依赖中。
标签: c++ compilation makefile