这里的第一个帖子,母语不是英语,很高兴发帖和帮助别人!
我在使用 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项目到微控制器编程。