2017-01-21 2 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:

I. "проект/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. AC_COMPLIE_IFELSE используется для определения количества параметров в функции mistery_value(). Я думаю, что это не имеет ничего общего с ошибкой.

II. проект/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 не должна быть установлена, а только скомпилирована, поэтому мне нужно использовать «noinst_» в lib_foo/Makefile.am. Вот почему я застрял здесь.

Любые ответы будут оценены. Спасибо за помощь!

ответ

1

Проблема в том, что вы используете рекурсивный автомат, и в этом случае зависимости, пересекающие пути к каталогам, просто не будут разрешаться для дополнительных правил: main/Makefile.am не знает, как сделать цели в lib_foo.

Быстрое исправление вверх, чтобы изменить SUBDIRS декларацию в верхнем уровне Makefile.am для:

SUBDIRS = lib_foo main 

Таким образом main/mystery_foo будет построен только после того, как lib_foo и его цели построены. Конечно, это не позволяет вам просто make в main/ и заставить его работать.

Другое предложение предыдущего поста, чтобы использовать non-recursive automake, является более правильным решением, потому что тогда все зависимости можно решить из одного Makefile.am.

-1

Ваша процедура выглядит в основном совершенно нормально.Я просто нашел несколько возможных ошибок :

  1. Ваш configure.ac должен иметь инструкцию LT_INIT
  2. В проекте/главная/Makefile.am Я хотел бы изменить ../lib_foo/libfoo.a к libfoo.a
  3. Если предыдущий не делает работа, я бы рекомендовал иметь один Makefile.am и не рекурсивная Makefile.am (рекурсивный Makefile.am может быть труднее коды и может повредить производительность компиляции)
+0

Могу ли я узнать, почему я пропустил голосование, обычно принято оставлять отзыв :) –

+1

Эй, Висенте, я решил это. Проблема в том, что в проекте/src/Makefile.am я установил подкаталог «main» перед «lib_foo». Таким образом, make будет иметь дело с «основным» перед «lib_foo». Но дело в src/main/main.c Мне нужно использовать «libfoo.a», который генерируется src/lib_foo/foo.c. Поэтому я изменяю проект/src/Makefile.am как «SUBDIRS = lib_foo main», и он работает. Спасибо за вашу помощь, кстати, я не знаю, почему здесь голосует, это не я :( –

Смежные вопросы