首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将文件名列表分配给GNU-make中的变量

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

Stack Overflow用户
提问于 2020-01-24 05:45:36
回答 2查看 439关注 0票数 1

第一篇帖子在这里,不是以英语为母语的人,乐于发帖和帮助他人!

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

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

代码语言:javascript
复制
SRC = $(shell find src/ -name "*.cpp")

在本例中使用find命令如下所示:

代码语言:javascript
复制
SOURCE_FILES = $(shell find -name '*.c')

结果是(在cmd上):

代码语言:javascript
复制
C:\AVR_projetos\Balizar_reserva>find -name '*.c'
./main.c
./modules/i2c/i2c.c
./modules/rom/rom.c

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

到目前为止我试过:

  • 使用$(通配符*.c)函数,同样的问题
  • 使用$(shell echo *.c),同样的问题
  • 使用附加参数-print0到-find强制内联输出,仍然没有。
  • 使用$(shell find ( path ) -name '*.c')使用主目录的绝对路径、相对./以及所有这些附加参数

另外,我还提到了这两页手册:

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

  • 这是我的文件目录:图像
  • 以及我的make文件(因为我试图实现这个,所以它到处都是):糊状桶

说句公道话,我在遇到这个问题之前遇到了一个问题:

代码语言:javascript
复制
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

为此,我找到了这个修复,它很适合工作。

  • 操作系统: Windows 10专业1903 comp。18362.535
  • GNU-制造: 3.81
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-25 01:10:52

谢谢大家的建议,我真的很感激。通过使用以下命令,可以让这个该死的东西正常工作:

代码语言:javascript
复制
$(shell find -name "*.c")

这样我们就可以将它赋值给一个变量并使用它。这样,我们就可以将下面的makefile用于相应的拟议项目结构。

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

代码语言:javascript
复制
.
├── modules
│   └── i2c
│       ├── i2c.c
│       └── i2c.h
├── main.c
├── Makefile
└── avr_config.h

从变量开始,可以有任意多个模块。

代码语言:javascript
复制
SOURCE_FILES = $(shell find -name "*.c")

把他们全部抓起来。我以最简单的方式设置了它,因此,目标文件将与源文件和头文件一起编译,然后在主目录中链接在一起。也是一个名为

代码语言:javascript
复制
depend.d

将被创建,以便进行编译。

makefile还包含一些有用的命令,这些命令在文件的编写过程中进行了描述。

希望这能帮到别人!一个专门的帖子将被做,解释所有的背景和如何建立一个通用的avr-gcc项目的微控制器编程在视觉工作室的代码。

票数 0
EN

Stack Overflow用户

发布于 2020-01-24 06:28:29

欢迎来到SO,正如您提到的那样,您引用了通配符函数,但是描述说:

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

那么我认为当您执行Make时,main.c编译了吗?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59890983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档