2017-01-21 64 views
0

我的第一個問題在堆棧溢出!GNU autotool:沒有規則,使目標

快速概述我的問題:我用autotool生成一個C程序。當我使用化妝命令,我遇到了錯誤:

No rule to make target `../lib_foo/libfoo.a', needed by `mistery_foo'. Stop. 

事情的細節我的問題

我做我的老師,的分配中,我應該使用GNU autotool生成一個非常簡單的C程序。

文件結構:/項目:主,lib_foo,Makefile.am,configure.ac

/項目/主:main.c中,main.h,Makefile.am

/項目/ lib_foo:foo.c的,foo.h中,Makefile.am

下面是我寫的configure.ac和makefile.am:

「項目/ configure.ac」

AC_PREREQ([2.67]) 
AC_INIT([project1],[0.01],[[email protected]]) 
AM_INIT_AUTOMAKE([1.9 foreign]) 
AC_CONFIG_SRCDIR([./lib_foo/foo.c]) 
AC_CONFIG_HEADERS([config.h]) 
AC_PROG_CC 
AC_PROG_RANLIB 
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <mistery.h>]],\ 
       [[ mistery_value(1);]])],\ 
       [AC_DEFINE([MISTERY_VALUE_ONEPARAM], [],[CONSTANT])],[]) 
AC_SEARCH_LIBS([mistery_value],[magic vadoo mistery],[],[AC_MSG_ERROR([Libraries (mistery, magic, vadoo) not found])]) 
AC_CONFIG_FILES([Makefile lib_foo/Makefile main/Makefile]) 
AC_OUTPUT 

附: AC_COMPLIE_IFELSE用於判斷函數mistery_value()中的參數個數。我認爲這與錯誤無關。

二, 項目/ Makefile.am

SUBDIRS = main lib_foo 

III。 項目/主/ Makefile.am

LDADD = ../lib_foo/libfoo.a 
mydir = ../uselessbin 
my_PROGRAMS = mistery_foo 
mistery_foo_SOURCES = main.c main.h 
mistery_foo_LDADD = ../lib_foo/libfoo.a 

IV。 項目/ lib_foo/Makefile.am

noinst_LIBRARIES = libfoo.a 
libfoo_a_SOURCES = foo.c foo.h 

然後我用命令的順序運行:

>cd project 
> aclocal 
> autoheader 
> automake -a 
> autoconf 
> ./configure 
> make 
> make install 
> ./uselessbin/mistery_foo 

當我運行使命令,我得到了錯誤:

No rule to make target `../lib_foo/libfoo.a', needed by `mistery_foo'. Stop. 

我想這個問題可能是我沒有libfoo.a正確安裝做。但庫libfoo.a不應安裝,但只有編譯,所以我必須在lib_foo/Makefile.am使用「noinst_」。這就是爲什麼我被困在這裏。

任何答案,將不勝感激。 感謝您的幫助!

回答

1

問題是您正在使用遞歸automake,並且在這種情況下,跨目錄路徑的依賴關係不會解析爲額外的規則:main/Makefile.am不知道如何在lib_foo中創建目標。

快速修復起來是頂級Makefile.am更改SUBDIRS聲明:

SUBDIRS = lib_foo main 

這樣main/mystery_foo只會lib_foo其目標是建成後建成。當然,這不允許你在main/中只需要make並讓它工作。

上一篇文章中使用non-recursive automake的另一個建議是更合適的解決方案,因爲這樣所有的依賴關係都可以從單個Makefile.am中解決。

-1

你的程序看起來大多是完全罰款。我只是發現了一些可能錯誤

  1. 你的configure.ac應該有LT_INIT指令
  2. 在項目/主/ Makefile.am我會改變../lib_foo/libfoo.alibfoo.a
  3. 如果以前沒有工作中,我建議有一個Makefile.am,而不是遞歸Makefile.am(遞歸Makefile.am可以更難的代碼,並可能損壞編譯的性能)
+0

我可以知道爲什麼我得到的表決通過,這通常是一個習慣留下反饋:) –

+1

嘿維森特,我已經解決了這個問題。問題是在project/src/Makefile.am中,我在「lib_foo」之前設置了子目錄「main」。所以make會在「lib_foo」之前處理「main」。但是,在src/main/main.c中,我需要使用由src/lib_foo/foo.c生成的「libfoo.a」。所以我修改project/src/Makefile.am就像「SUBDIRS = lib_foo main」,它可以工作。感謝您的幫助,順便說一下,我不知道爲什麼這裏有投票,這不是我:( –