如何将一个makefile包含到另一个makefile中? 我有一些C++类,每个都有自己的文件夹,其中有一个MaFIX文件,Test.CPP用于测试目的等。 Main folder |-> Class1 folder |-> Class2 folder |-> Class2.1 folder |-> Class2 folder
我有一个主要项目,必须包括这些类。我正在尝试将所有子makefile包含到主makefile中 我尝试过使用“INCLUDE POO/makefile”,但此解决方案有两个问题:如何将一个makefile包含到另一个makefile中? 我有一些C++类,每个都有自己的文件夹,其中有一个MaFIX文件,Test.CPP用于测试目的等。 Main folder |-> Class1 folder |-> Class2 folder |-> Class2.1 folder |-> Class2 folder,c++,makefile,g++,C++,Makefile,G++,我有一个主要项目,必须包括这些类。我正在尝试将所有子makefile包含到主makefile中 我尝试过使用“INCLUDE POO/makefile”,但此解决方案有两个问题: 子生成文件的路径不正确,因此找不到文件(“没有生成目标“Vector3D.cpp”的规则”) “test.cpp”文件被覆盖,可能是因为路径问题。(“警告:覆盖目标的配方…”) 我希望所有的makefile都是独立的,这样我就可以将类文件夹复制/粘贴到一个新的项目中,并且它仍然工作,或者我可以单独执行makefil
- 子生成文件的路径不正确,因此找不到文件(“没有生成目标“Vector3D.cpp”的规则”)
- “test.cpp”文件被覆盖,可能是因为路径问题。(“警告:覆盖目标的配方…”)
make
(因此不要包含它们)或者您可以通过包含其他makefile来形成一个非递归的makefile。我不认为两者都能做到
如何(正确地)将一个makefile包含到另一个makefile中
唯一有效的答案是“使用include
指令”(除了通常的“it dependens”之外)。任何其他建议都取决于makefile的结构。设计为包含的makefile显然更容易包含。只是包括一些随机的makefile并希望它能工作。。。不行。查看并了解如何使非递归makefile工作
请注意,无需将它们包含在文件顶部,这样做可能是个坏主意,因为默认目标将成为包含文件中的第一个目标。感谢@Jonathan wakely为该解决方案提供了初始概念
也许有很多地方可以改进,但它是有效的
所需资源摘要:
- makefile应该独立工作
- 主生成文件将包括子生成文件
- 不应出现冲突或路径问题
一个简单的解决方案是递归调用makefile:
- 为leaf makefiles创建一个“普通”脚本
- 使用空目标允许执行始终发出呼叫,例如“sub make:”之后不需要任何要求:
- 使用“-C”参数为make调用设置根目录
- 使用子makefiles创建的二进制文件创建最终链接
主生成文件的示例:
#all make recursive calls
sub-make:
make -C Vector3D
make -C Color
#final linking
CPP = g++
FLAGS = $(CXXINCS) -Wall -O0
all: main
main: main.o Vector3D/Vector3D.o Color/Color.o
$(CPP) main.o Vector3D/Vector3D.o Color/Color.o -o main
main.o: main.cpp
$(CPP) -c main.cpp -o main.o $(FLAGS)
可能有更好的方法向链接器提供*.o二进制文件,而无需写入所有完整路径,但这是另一个问题
创建干净的目标。对于leaf makefiles,没有特别的注意事项,但是对于主makefile,它必须调用sub-clean规则
clean:
make -C Vector3D clean
make -C Color clean
rm -f *.o main
编辑:
下面是我所做的makefile结构,如果它对任何人都有用的话
要工作,所有类必须位于其自己的文件夹中,其中包含:
- .hpp集管
- .cpp代码
- 用于测试的main.cpp
- 与此makefile相关的必需类(LIBS)目录用“$(LIBSPATH)LibName”指定
生成文件
#Following configuration may be set with a parameter:
# e.g: make FLAGS="-Wall -O0"
FLAGS = $(CXXINCS) -Wall -O0
#Configurable variables
EXEC = main
CLASS = World
LIBS = Color Vector3D Triangle
LIBSPATH = ../
#Static content
CPP = g++
OBJS = $(foreach dir, $(LIBS), $(LIBSPATH)$(dir)/$(dir))
all: $(EXEC)
clean:
rm -f *.o $(EXEC)
$(foreach dir,$(LIBS),make clean --no-print-directory -C $(LIBSPATH)$(dir);)
$(EXEC): $(CLASS).o $(EXEC).o $(OBJS:=.o)
$(CPP) $(CLASS).o $(OBJS:=.o) $(EXEC).o -o $(EXEC)
$(EXEC).o: $(EXEC).cpp
$(CPP) -c $(EXEC).cpp -o $(EXEC).o $(CXXFLAGS)
$(CLASS).o: $(CLASS).cpp $(CLASS).hpp
$(CPP) -c $(CLASS).cpp -o $(CLASS).o $(CXXFLAGS)
$(OBJS:=.o): $(OBJS:=.cpp) $(OBJS:=.hpp)
make --no-print-directory -C $(LIBSPATH)$(strip $(foreach dir,$(LIBS),$(if $(findstring $(dir),$@),$(dir))))
谢谢你的回答,我已经用我使用的解决方案写了一个答案“实现非递归make”链接已经死了
clean:
make -C Vector3D clean
make -C Color clean
rm -f *.o main
#Following configuration may be set with a parameter:
# e.g: make FLAGS="-Wall -O0"
FLAGS = $(CXXINCS) -Wall -O0
#Configurable variables
EXEC = main
CLASS = World
LIBS = Color Vector3D Triangle
LIBSPATH = ../
#Static content
CPP = g++
OBJS = $(foreach dir, $(LIBS), $(LIBSPATH)$(dir)/$(dir))
all: $(EXEC)
clean:
rm -f *.o $(EXEC)
$(foreach dir,$(LIBS),make clean --no-print-directory -C $(LIBSPATH)$(dir);)
$(EXEC): $(CLASS).o $(EXEC).o $(OBJS:=.o)
$(CPP) $(CLASS).o $(OBJS:=.o) $(EXEC).o -o $(EXEC)
$(EXEC).o: $(EXEC).cpp
$(CPP) -c $(EXEC).cpp -o $(EXEC).o $(CXXFLAGS)
$(CLASS).o: $(CLASS).cpp $(CLASS).hpp
$(CPP) -c $(CLASS).cpp -o $(CLASS).o $(CXXFLAGS)
$(OBJS:=.o): $(OBJS:=.cpp) $(OBJS:=.hpp)
make --no-print-directory -C $(LIBSPATH)$(strip $(foreach dir,$(LIBS),$(if $(findstring $(dir),$@),$(dir))))