首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autotools Makefile找不到源代码

Autotools Makefile找不到源代码
EN

Stack Overflow用户
提问于 2022-03-08 15:51:02
回答 2查看 305关注 0票数 0

我试图在Yocto项目中使用自动工具。与另一个用户一起工作时,我可以让bitbake识别我的autogen.shconfigure.acMakefile.am。我现在收到错误了

代码语言:javascript
复制
make: *** No rule to make target 'main.c', needed by 'main.o'.  Stop.

我的树如下:

代码语言:javascript
复制
.
├── files
│   ├── MAIN_Application
│   │   ├── autogen.sh
│   │   ├── configure.ac
│   │   ├── include
│   │   │   ├── main.h
│   │   │   ├── scheduler.h
│   │   │   └── utilities
│   │   │       └── time_conversions.h
│   │   ├── Makefile.am
│   │   ├── project.yml
│   │   └── src
│   │       ├── main.c
│   │       ├── Makefile.am
│   │       ├── scheduler.c
│   │       └── utilities
|   |           ├── Makefile.am
│   │           └── time_conversions.c
│   └── services
│       └── mainapplication.service
└── mainapplication_0.0.bb

我的makefile.am如下:

代码语言:javascript
复制
AUTOMAKE_OPTIONS = foreign

CFLAGS = -Wall -pedantic -O2
include_HEADERS = main.h

bin_PROGRAMS = MAIN_Application
MAIN_Application_SOURCES = main.c

我想我需要添加我的其他源文件。我不知道如何这样做。我是用MAIN_Application_SOURCES添加它们还是需要在每个子目录中添加一个Makefile.am

编辑:将链接添加到前面的问题中。编辑2:我在每个目录中添加了一个makefile.am。在MAIN_Application中,我有:

代码语言:javascript
复制
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src

在src中,我有:

代码语言:javascript
复制
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = MAIN_Application
EVCC_Application_SOURCES = main.c scheduler.c time_conversions.c

这就产生了一个新的错误:

代码语言:javascript
复制
| Making all in src
| /bin/bash: line 20: cd: src: No such file or directory
| make: *** [Makefile:332: all-recursive] Error 1
| ERROR: oe_runmake failed

编辑3:如果我删除我的src和包括文件夹,把所有的东西放在一个文件夹(顶级),所有的工作。这太丑了,我讨厌它。

代码语言:javascript
复制
.
├── files
│   ├── MAIN_Application
│   │   ├── autogen.sh
│   │   ├── configure.ac
│   │   ├── main.c
│   │   ├── main.h
│   │   ├── Makefile.am
│   │   ├── project.yml
│   │   ├── scheduler.c
│   │   ├── scheduler.h
│   │   ├── time_conversions.c
│   │   └── time_conversions.h
│   └── services
│       └── mainapplication.service
└── mainapplication_0.0.bb

一定有办法解决这个问题。

编辑4:我正在尝试将我的所有代码移到src目录中,并在我的SUBDIR中使用makefile.am

代码语言:javascript
复制
.
├── files
│   ├── MAIN_Application
│   │   ├── autogen.sh
│   │   ├── configure.ac
│   │   ├── include
│   │   ├── Makefile.am
│   │   ├── project.yml
│   │   ├── src
│   │   │   ├── main.c
│   │   │   ├── main.h
│   │   │   ├── Makefile.am
│   │   │   ├── scheduler.c
│   │   │   ├── scheduler.h
│   │   │   ├── time_conversions.c
│   │   │   └── time_conversions.h
│   │   └── test
│   │       ├── test_scheduler.c
│   │       └── test_time_conversions.c
│   └── services
│       └── mainapplication.service
└── mainapplication_0.0.bb

这将导致同样的src no such file or directory错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-08 19:37:40

我想我需要添加我的其他源文件。我不知道如何这样做。

有不止一种方法可以做到这一点,但不管怎样,你确实需要告诉Automake所有相关的来源。根据您的操作方式,您可能需要的不仅仅是指定源。

我是用MAIN_Application_SOURCES添加它们还是需要在每个子目录中添加一个Makefile.am?

对于问题中描述的项目,您可以并且可能应该将它们添加到顶级MAIN_Application_SOURCES中的Makefile.am中。在这种情况下,您可能不需要任何其他Makefile.am文件。您应该提供相对于包含Makefile.am的目录的路径,所以如下所示:

代码语言:javascript
复制
MAIN_Application_SOURCES = \
  src/main.c \
  src/scheduler.c \
  src/utilities/time_conversions.c

(没有必要使用上面的一行格式,但我发现这比将多个文件名放在一行上容易得多。)在本例中,您可能还希望将subdir-objects添加到AUTOMAKE_OPTIONS中。

代码语言:javascript
复制
AUTOMAKE_OPTIONS = foreign subdir-objects

只有当您希望生成更多的Makefile.am文件时才需要更多的Makefile文件,这通常与递归make相关联。

此外,为了有用,Makefile.am必须至少定义一个要构建的目标,而且我在整个项目(MAIN_Application)中只看到一个自然目标。您可以引入所谓的“方便库”作为子目录make的目标,但我不赞成这种方法,也不赞成递归make的大多数使用。

另外这个..。

代码语言:javascript
复制
include_HEADERS = main.h

..。并不意味着你可能认为它意味着什么。它说文件main.h (在当前目录中或将在当前目录中生成)应该由make install安装到$(includedir)中。对于main.h与其他目标的关系,它并没有说明任何问题。我仍在假设一个顶级的Makefile.am,我认为你在这里想要的完全不同:

代码语言:javascript
复制
AM_CPPFLAGS = -I$(srcdir)/include

这将导致向编译器提供一个看似合适的-I选项。

假设您不需要对make dist的支持,并且实际上不希望将头文件安装为make install的一部分,则不需要将单个头文件显式地指定为Automake。

票数 1
EN

Stack Overflow用户

发布于 2022-03-08 19:36:58

问题在于configure.ac!这是我的新文件夹结构

代码语言:javascript
复制
.
├── files
│   ├── MAIN_Application
│   │   ├── autogen.sh
│   │   ├── configure.ac
│   │   ├── include
│   │   │   ├── main.h
│   │   │   ├── scheduler.h
│   │   │   └── utilities
│   │   │       └── time_conversions.h
│   │   ├── Makefile.am
│   │   ├── project.yml
│   │   ├── src
│   │   │   ├── main.c
│   │   │   ├── Makefile.am
│   │   │   ├── scheduler.c
│   │   │   └── utilities
│   │   │       └── time_conversions.c
│   │   └── test
│   │       ├── test_scheduler.c
│   │       └── test_time_conversions.c
│   └── services
│       └── mainapplication.service
└── mainapplication_0.0.bb

我的顶级Makefile.am包含:

代码语言:javascript
复制
AUTOMAKE_OPTIONS = foreign
SUBDIRS =  src

我在src中的Makefile.am包含

代码语言:javascript
复制
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = MAIN_Application
MAIN_Application_SOURCES = main.c scheduler.c time_conversions.c

显然,上述问题并没有改变我的看法。在我的configure.ac中,我向AC_CONFIG_FILES添加了一项。这条线从

代码语言:javascript
复制
AC_CONFIG_FILES([Makefile])

代码语言:javascript
复制
AC_CONFIG_FILES([Makefile src/Makefile])

无论何时使用这样的子目录,都需要告诉autotools。我通过在GitHub上搜索类似的项目来解决这个问题,我找到了

在这个项目中,他们有一个顶级的makefile,以及每个包含源文件的子目录中的makefile。在他们的configure.ac中,他们也给每个makefile一个路径!

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

https://stackoverflow.com/questions/71397832

复制
相关文章

相似问题

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