[英]Autotools Makefile cannot find sources
我正在嘗試在我的 Yocto 項目中使用 autotools。 與另一個用戶合作,我能夠讓 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 和 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_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
時,您才需要更多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.