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!
Darf ich wissen, warum ich nach unten abgestimmt werde, ist es in der Regel eine Gewohnheit, ein Feedback zu hinterlassen :) –
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 :( –