C语言 不能将文件名列表分配给 GNU-make 中的变量



这里的第一个帖子,母语不是英语,很高兴发帖和帮助别人!

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

使用我发现的这种方法,Renaud Pacalet使用以下语法:

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

在我的情况下使用 find 命令如下所示:

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

结果是(在 cmd 上(:

C:AVR_projetosBalizar_reserva>find -name '*.c'
./main.c
./modules/i2c/i2c.c
./modules/rom/rom.c

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

到目前为止,我尝试了:

  • 使用 $(通配符 *.c( 函数,同样的问题
  • 使用 $(外壳回显 *.c(,同样的问题
  • 使用附加参数 -print0 到 -find 强制内联输出,仍然没有任何内容
  • 使用 $(shell find (path( -name '*.c'( 使用主目录的绝对路径,相对 ../,并且全部与附加参数结合使用

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

  • 外壳功能
  • 通配符函数

他们俩都以简单的方式解释说这是可能的,我做同样的事情,但一无所获。

  • 这是我的文件目录:图片

  • 还有我的make文件(它到处都是,因为我试图实现这个(:粘贴垃圾桶

作为记录,我在遇到此问题之前遇到了问题:

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

为此,我发现此修复程序有效。

  • 操作系统: 视窗 10 专业版 1903 公司 18362.535

  • GNU-make: 3.81

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

通配符函数的一个用途是获取目录中所有 C 源文件的列表,如下所示:$(wildcard *.c)

然后我想当你执行 Make 时,main.c 编译了?

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

感谢大家的建议,我真的很感激。使用以下命令让该死的东西工作:

$(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

将创建以便进行编译。

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

希望这对某人有所帮助!将发表一篇专门的文章,解释所有上下文以及如何在Visual Studio代码中设置通用的avr-gcc项目到微控制器编程。

相关内容

  • 没有找到相关文章

最新更新