Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将一个makefile包含到另一个makefile中? 我有一些C++类,每个都有自己的文件夹,其中有一个MaFIX文件,Test.CPP用于测试目的等。 Main folder |-> Class1 folder |-> Class2 folder |-> Class2.1 folder |-> Class2 folder_C++_Makefile_G++ - Fatal编程技术网

如何将一个makefile包含到另一个makefile中? 我有一些C++类,每个都有自己的文件夹,其中有一个MaFIX文件,Test.CPP用于测试目的等。 Main folder |-> Class1 folder |-> Class2 folder |-> Class2.1 folder |-> Class2 folder

如何将一个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

我有一个主要项目,必须包括这些类。我正在尝试将所有子makefile包含到主makefile中

我尝试过使用“INCLUDE POO/makefile”,但此解决方案有两个问题:

  • 子生成文件的路径不正确,因此找不到文件(“没有生成目标“Vector3D.cpp”的规则”)
  • “test.cpp”文件被覆盖,可能是因为路径问题。(“警告:覆盖目标的配方…”)
我希望所有的makefile都是独立的,这样我就可以将类文件夹复制/粘贴到一个新的项目中,并且它仍然工作,或者我可以单独执行makefile而不做任何更改

所以问题是:如何(正确地)将一个makefile包含到另一个makefile中

示例,仅用于测试目的。

主生成文件(简化)

子生成文件示例(简化)

颜色/生成文件与Vector3D类似

我希望所有的makefile都是独立的,因此我可以将类文件夹复制/复制到一个新项目中,并且它仍在工作,或者我可以单独执行makefile而不对其进行更改

我很确定那是不可能的。您的makefile需要是独立的,在这种情况下,您可以使顶级文件递归地调用较低级别目录中的
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))))