簡體   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