【问题标题】:Multi directory makefile for project项目的多目录makefile
【发布时间】:2017-12-21 04:08:25
【问题描述】:

这是我的目录的样子:

/project
    makefile
    /ceda_lib
        makefile
        files....
    /general
        makefile
        files....
    /CLI
        makefile
        files....
    /objects
         files.o 

生成文件(主):

1  #start other makefiles
2  
3 
4  o= ./objects
5  DEPS= Affine.hpp CEDA.hpp generalParameters.hpp generalFunctions.hpp
6  OBJ= $o/main.o $o/Affine.o $o/generalFunctions.o
7  CC=g++
8  CFLAGS= -Wall -g -I.
9  export CC
10 export CFLAGS
11 export DEPS
12 
13 all: 
14 ▸---+$(MAKE) -C general
15 ▸---+$(MAKE) -C ceda_lib 
16 ▸---+$(MAKE) -C CLI
17 
18 run: $(OBJ) $(DEPS)
19 ▸---$(CC) -o $@ $^

其他 makefile 如下所示:(update2)

  1 include ../makefile.variables
  2 
  3 OBJ = main.o
  4 all: $(OBJ)
  5 
  6 $(OBJ): %.o: %.cpp $(DEPS)
  7 ▸---$(CC) -o ../objects/$@ -c $< $(CFLAGS)

我要做的是编译 3 个目录中的所有代码,并将所有对象存储在 /object 目录中。然后将从 $DEPS 和 /object 目录的内容创建一个可执行文件。

这个makefile 不能正常工作。您能否找出我做错了什么,您能否建议我改进代码的方法。 (我对 makefile 很陌生)。

这也是我尝试制作项目时的输出:(Update2)

make: Entering directory '/home/george/Documents/CEDA'
make -C general
make[1]: Entering directory '/home/george/Documents/CEDA/general'
g++ -o ../objects/generalFunctions.o -c generalFunctions.cpp -Wall -g -I.
make[1]: Leaving directory '/home/george/Documents/CEDA/general'
make -C ceda_lib
make[1]: Entering directory '/home/george/Documents/CEDA/ceda_lib'
g++ -o ../objects/Affine.o -c Affine.cpp -Wall -g -I.
Affine.cpp:4:33: fatal error: generalParameters.hpp: No such file or directory
 #include "generalParameters.hpp"
                                 ^
compilation terminated.
makefile:7: recipe for target 'Affine.o' failed
make[1]: *** [Affine.o] Error 1
make[1]: Leaving directory '/home/george/Documents/CEDA/ceda_lib'
makefile:8: recipe for target 'All' failed
make: *** [All] Error 2
make: Leaving directory '/home/george/Documents/CEDA'

这是 makefile.variables

  1 #variables used by all makefiles in project directory
  2 
  3 PATH_TO_DIR = ~/Documents/CEDA
  4 c = $(PATH_TO_DIR)/ceda_lib
  5 g = $(PATH_TO_DIR)/general
  6 e = $(PATH_TO_DIR)/CLI         #e for executable
  7 
  8 DEPS= $c/Affine.hpp $c/CEDA.hpp $g/generalParameters.hpp $g/generalFunctions.hpp
  9 CC=g++
 10 CFLAGS= -Wall -g -I.

【问题讨论】:

    标签: makefile multiple-makefiles


    【解决方案1】:

    这里:

    OBJ= main.o
    
    ../objects/%.o: %.cpp $(DEPS)
        $(CC) -c $< $(CFLAGS)
    

    这个 makefile 包含一个规则,它是一个模式规则,是一种构建任何名称如../objects/foo.o 的文件的方法。但它不会告诉 Make 要构建哪个 目标文件。准确地说,模式规则不能是默认规则。

    解决此问题的最简单方法是添加一条普通规则:

    ../objects/$(OBJ):
    

    一旦你完成了这个工作,你将拥有目标文件,但在主 makefile 中仍然存在问题。 run 规则不会构建可执行文件,如果您想执行该规则,则必须在命令行中调用它,它不会自动执行。

    在掌握基础知识之前,您正在尝试递归使用 Make(这很棘手)。我建议你尝试使用makefile构建目标文件,然后尝试使用命令行构建可执行文件,然后仔细查看你使用的命令并重写run规则。

    一旦你做到了这一点,其他改进是可能的。 (Make 是一个强大的工具,但它的学习曲线很长。)

    编辑:如果它根本不起作用,请先尝试更简单的方法。

    ceda_lib中选择一个源文件,比如,我不知道main.cpp。验证源文件是否存在以及相应的目标文件 (main.o) 是否存在。将makefile(ceda_lib/)编辑为:

    main.o: main.cpp
        $(CC) -c $< $(CFLAGS)
    

    然后在ceda_lib/ 内尝试make 看看会发生什么。

    如果它构建main.o,则删除main.o,然后从project/ 尝试make -C ceda_lib,看看会发生什么。如果这构建了 ceda_lib/main.o,那么我们可以继续使用更高级的 makefile。

    【讨论】:

    • 我认为我没有正确使用“导出”。你能帮我多一点吗?我添加了 ../objects/$(OBJ): 规则,现在它全部执行但它不编译任何东西。它只是按顺序进入 makefile 并说:Nothing to be done for ..
    • @alienCY:没什么可做的……什么?它提到了什么目标?你确定目标不存在吗?另外,您使用的是 Make 的帽子版本吗? (make -v 如果您不确定。)
    • GNU Make 4.1 为 x86_64-pc-linux-gnu 构建,顺便说一句,我的电脑是 64 位的!
    • 我已经更新了makefile。我现在使用包含(但看起来这不是问题)当我进入目录并进行制作时,我仍然得到相同的响应。请检查更新的文件。我认为问题出在对象目录上。
    • @alienCY:我认为问题出在子目录中。我再次敦促您尝试简化版;在您获得某个版本之前,该错误可能存在于任何地方。
    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多