无法将文件名列表分配给 GNU-make 中的变量

Can't assign a list of file names to a variable in GNU-make

这里先post,母语不是英语的人,很高兴post帮助别人!

我在使用 make 为我编译 avr-gcc 项目时遇到问题。更具体地说,将不同目录(在我的例子中是子目录)的 *.c 源文件列表分配给 make 中的一个变量,它将用于生成依赖项。

使用我发现的 方法,Renaud Pacalet 使用此语法:

SRC = $(shell find src/ -name "*.cpp")

在我的案例中使用 find 命令如下所示:

SOURCE_FILES = $(shell find -name '*.c')

结果是(在 cmd 上):

C:\AVR_projetos\Balizar_reserva>find -name '*.c'
./main.c
./modules/i2c/i2c.c
./modules/rom/rom.c

但是,当 make 调用 shell 来执行脚本时,变量只保存序列中的第一个文件名。

到目前为止我试过:

另外,我参考了这两个手册页:

他们都简单的解释了这是可以的,我也是这样,结果什么也没有

郑重声明,在遇到这个问题之前我遇到了一个问题:

avr-gcc -MM main.c > depend.d
  0 [main] sh 14484 sync_with_child: child 15780(0x1DC) died before initialization with status code 0xC0000142
158 [main] sh 14484 sync_with_child: *** child state waiting for longjmp
/usr/bin/sh: fork: Resource temporarily unavailable make: *** [depend] Error 128

为此,我发现 This fix 看起来很有效。

欢迎来到 SO, 正如您提到的,您指的是通配符函数,但描述中说:

One use of the wildcard function is to get a list of all the C source files in a directory, like this: $(wildcard *.c).

那我觉得你执行Make的时候,main.c编译了?

您需要改进您的通配符以搜索子目录或手动添加它们。 看看这个 answer 和问题。

谢谢大家的建议,非常感谢。使用以下命令让该死的东西工作:

$(shell find -name "*.c")

这样我们就可以将它分配给一个变量并使用它。有了这个,我们就可以使用下面的makefile来对应建议的项目结构了。

这个项目是为 avr-gcc 编程设置的,但是,这个概念适用于普通的 c 和 cpp 编程。 文件结构(例如,在编译avr-gcc相关项目时,i2c可以是通用模块,avr_config.h是一个特殊的头文件):

.
├── modules
│   └── i2c
│       ├── i2c.c
│       └── i2c.h
├── main.c
├── Makefile
└── avr_config.h

自从变量

以来,可以有任意多的模块
SOURCE_FILES = $(shell find -name "*.c")

全部捕获。我以最简单的方式设置它,因此目标文件将与源文件和头文件一起编译,然后在主目录中链接在一起。 还有一个名为

的文件
depend.d

将创建以完成编译。

makefile 还包含文件开头描述的一些有用的命令。

希望这对某人有所帮助!将制作一个专门的 post,解释所有上下文以及如何在 visual studio 代码中为微控制器编程设置一个通用的 avr-gcc 项目。