我试图在Yocto项目中使用自动工具。与另一个用户一起工作时,我可以让bitbake识别我的autogen.sh、configure.ac和Makefile.am。我现在收到错误了
make: *** No rule to make target 'main.c', needed by 'main.o'. Stop.我的树如下:
.
├── 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如下:
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中,我有:
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src在src中,我有:
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = MAIN_Application
EVCC_Application_SOURCES = main.c scheduler.c time_conversions.c这就产生了一个新的错误:
| 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和包括文件夹,把所有的东西放在一个文件夹(顶级),所有的工作。这太丑了,我讨厌它。
.
├── 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。
.
├── 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错误。
发布于 2022-03-08 19:37:40
我想我需要添加我的其他源文件。我不知道如何这样做。
有不止一种方法可以做到这一点,但不管怎样,你确实需要告诉Automake所有相关的来源。根据您的操作方式,您可能需要的不仅仅是指定源。
我是用MAIN_Application_SOURCES添加它们还是需要在每个子目录中添加一个Makefile.am?
对于问题中描述的项目,您可以并且可能应该将它们添加到顶级MAIN_Application_SOURCES中的Makefile.am中。在这种情况下,您可能不需要任何其他Makefile.am文件。您应该提供相对于包含Makefile.am的目录的路径,所以如下所示:
MAIN_Application_SOURCES = \
src/main.c \
src/scheduler.c \
src/utilities/time_conversions.c(没有必要使用上面的一行格式,但我发现这比将多个文件名放在一行上容易得多。)在本例中,您可能还希望将subdir-objects添加到AUTOMAKE_OPTIONS中。
AUTOMAKE_OPTIONS = foreign subdir-objects只有当您希望生成更多的Makefile.am文件时才需要更多的Makefile文件,这通常与递归make相关联。
此外,为了有用,Makefile.am必须至少定义一个要构建的目标,而且我在整个项目(MAIN_Application)中只看到一个自然目标。您可以引入所谓的“方便库”作为子目录make的目标,但我不赞成这种方法,也不赞成递归make的大多数使用。
另外这个..。
include_HEADERS = main.h..。并不意味着你可能认为它意味着什么。它说文件main.h (在当前目录中或将在当前目录中生成)应该由make install安装到$(includedir)中。对于main.h与其他目标的关系,它并没有说明任何问题。我仍在假设一个顶级的Makefile.am,我认为你在这里想要的完全不同:
AM_CPPFLAGS = -I$(srcdir)/include这将导致向编译器提供一个看似合适的-I选项。
假设您不需要对make dist的支持,并且实际上不希望将头文件安装为make install的一部分,则不需要将单个头文件显式地指定为Automake。
发布于 2022-03-08 19:36:58
问题在于configure.ac!这是我的新文件夹结构
.
├── 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包含:
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src我在src中的Makefile.am包含
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = MAIN_Application
MAIN_Application_SOURCES = main.c scheduler.c time_conversions.c显然,上述问题并没有改变我的看法。在我的configure.ac中,我向AC_CONFIG_FILES添加了一项。这条线从
AC_CONFIG_FILES([Makefile])至
AC_CONFIG_FILES([Makefile src/Makefile])无论何时使用这样的子目录,都需要告诉autotools。我通过在GitHub上搜索类似的项目来解决这个问题,我找到了这。
在这个项目中,他们有一个顶级的makefile,以及每个包含源文件的子目录中的makefile。在他们的configure.ac中,他们也给每个makefile一个路径!
https://stackoverflow.com/questions/71397832
复制相似问题