无法将文件名列表分配给 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 来执行脚本时,变量只保存序列中的第一个文件名。
到目前为止我试过:
- 使用 $(wildcard *.c) 函数,同样的问题
- 使用$(shell echo *.c),同样的问题
- 使用附加参数 -print0 到 -find 强制进行内联输出,仍然没有结果
- 使用 $(shell find (path) -name '*.c') 使用主目录的绝对路径、相对 ../,以及所有与附加参数的组合
另外,我参考了这两个手册页:
他们都简单的解释了这是可以的,我也是这样,结果什么也没有
郑重声明,在遇到这个问题之前我遇到了一个问题:
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 看起来很有效。
Os: Windows 10 专业 1903 comp. 18362.535
GNU-make: 3.81
欢迎来到 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来对应建议的项目结构了。
- 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 项目。
这里先post,母语不是英语的人,很高兴post帮助别人!
我在使用 make 为我编译 avr-gcc 项目时遇到问题。更具体地说,将不同目录(在我的例子中是子目录)的 *.c 源文件列表分配给 make 中的一个变量,它将用于生成依赖项。
使用我发现的
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 来执行脚本时,变量只保存序列中的第一个文件名。
到目前为止我试过:
- 使用 $(wildcard *.c) 函数,同样的问题
- 使用$(shell echo *.c),同样的问题
- 使用附加参数 -print0 到 -find 强制进行内联输出,仍然没有结果
- 使用 $(shell find (path) -name '*.c') 使用主目录的绝对路径、相对 ../,以及所有与附加参数的组合
另外,我参考了这两个手册页:
他们都简单的解释了这是可以的,我也是这样,结果什么也没有
郑重声明,在遇到这个问题之前我遇到了一个问题:
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 看起来很有效。
Os: Windows 10 专业 1903 comp. 18362.535
GNU-make: 3.81
欢迎来到 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来对应建议的项目结构了。
- 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 项目。