繁体   English   中英

Autotools Makefile 找不到源

[英]Autotools Makefile cannot find sources

我正在尝试在我的 Yocto 项目中使用 autotools。 与另一个用户合作,我能够让 bitbake 识别我的autogen.shconfigure.acMakefile.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 和 include 文件夹,将所有内容放入一个文件夹(顶级),一切正常。 这很丑陋,我讨厌它。

.
├── 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 目录并在我的makefile.am中使用SUBDIR

.
├── 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

我相信我需要添加其他源文件。 我不确定该怎么做。

有不止一种方法可以做到这一点,但是无论如何,是的,您确实需要告诉 Automake 所有涉及的来源。 根据您的操作方式,您可能需要的不仅仅是指定来源。

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

对于问题中描述的项目,您可以并且可能应该将它们添加到顶级MAIN_Application_SOURCESMakefile.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时,您才需要更多Makefile.am文件,这通常与递归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的支持,并且您实际上不想将 header 文件作为make install的一部分进行安装,则您不需要明确指定单个 header 文件到 Automake。

问题出在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 的路径!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM