2017-01-21 4 views
0

meine erste Frage im Stapelüberlauf!GNU Autotool: Keine Regel um Ziel zu machen

Schnellübersicht meiner Frage: Ich benutze Autotool, um ein C-Programm zu generieren. Wenn ich make Befehl verwenden, treffe ich den Fehler:

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

Detail Etwas meine Fragen:

ich einen Auftrag meines Lehrers tue, in der ich GNU Autotool verwenden sollte um ein sehr einfaches C-Programm zu erzeugen.

Dateistruktur:/Projekt: Haupt, lib_foo, Makefile.am, configure.ac

/Projekt/main: main.c, main.h, Makefile.am

/Projekt/lib_foo: foo.c, foo.h, Makefile.am

Es folgt, was ich schreibe für configure.ac und makefile.am:

I. "Projekt/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 

P.S. Mit AC_COMPLIE_IFELSE wird die Anzahl der Parameter in der Funktion mistery_value() beurteilt. Ich denke, es hat nichts mit dem Fehler zu tun.

II. Projekt/Makefile.am:

SUBDIRS = main lib_foo 

III. Projekt/main/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. Projekt/lib_foo/Makefile.am

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

Dann habe ich mit der Reihenfolge der Befehle ausführen:

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

Wenn ich laufen Befehl machen, habe ich den Fehler:

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

Ich vermute, das Problem kann sein, dass ich libfoo.a nicht richtig installiert habe. Aber die Bibliothek libfoo.a sollte nicht installiert werden, sondern nur kompiliert, so dass ich 'noinst_' in lib_foo/Makefile.am verwenden muss. Deshalb bleibe ich hier hängen.

Alle Antworten werden geschätzt. Danke für Ihre Hilfe!

Antwort

1

Das Problem ist, dass Sie rekursive Automake verwenden, und in diesem Fall werden Abhängigkeiten, die Verzeichnispfade überqueren, nur nicht in zusätzliche Regeln aufgelöst: main/Makefile.am weiß nicht, wie man Ziele in lib_foo macht.

Die schnelle Lösung up ist Ihre SUBDIRS Deklaration in der Top-Level-Makefile.am zu ändern:

SUBDIRS = lib_foo main 

diese Weise main/mystery_foo wird erst nach lib_foo und seine Ziele gebaut werden gebaut werden. Natürlich erlaubt das nicht, nur make in main/ und es funktioniert.

Der andere Vorschlag aus dem vorherigen Beitrag, non-recursive automake zu verwenden, ist eine geeignetere Lösung, weil dann alle Abhängigkeiten von einem einzelnen Makefile.am gelöst werden können.

-1

Ihr Verfahren sieht meist völlig in Ordnung.Ich fand nur ein paar möglichen Fehler:

  1. Ihre configure.ac sollte
  2. Im Projekt LT_INIT Anweisung hat/main/Makefile.am I ../lib_foo/libfoo.a-libfoo.a
  3. ändern würde, wenn die vorherigen nicht Arbeit, würde ich empfehlen, eine einzige Makefile.am zu haben und nicht rekursive Makefile.am (rekursive Makefile.am kann schwieriger zu Code und kann die Leistung der Compilation Schäden)
+0

Darf ich wissen, warum ich nach unten abgestimmt werde, ist es in der Regel eine Gewohnheit, ein Feedback zu hinterlassen :) –

+1

Hey Vicente, ich habe das gelöst. Das Problem ist, dass ich in project/src/Makefile.am das Unterverzeichnis "main" vor "lib_foo" setze. Also machen wir mit "main" vor "lib_foo". Aber die Sache ist in src/main/main.c Ich brauche "libfoo.a", die von src/lib_foo/foo.c erzeugt wird. Also ändere ich project/src/Makefile.am wie "SUBDIRS = lib_foo main" und es funktioniert. Danke für deine Hilfe, übrigens weiß ich nicht warum es hier eine Abstimmung gibt, ich bin es nicht :( –

Verwandte Themen