В make-файле обнаружена рекурсивная зависимость для создания статической библиотеки - PullRequest
0 голосов
/ 15 октября 2010

У меня есть 4 .c файла hello.c, here.c, bye.c и main.c. Один заголовочный файл mylib.h

Содержимое выглядит следующим образом

hello.c

#include<stdio.h>

void hello()
{
    printf("Hello!\n");
}

здесь.c

#include<stdio.h>

void here()
{
     printf("I am here \n");
}

bye.c

#include<stdio.h>

void bye()
{
    printf("Bye,Bye");
}

main.c

#include<stdio.h>
#include "mylib.h"

int main()
{ 

  hello();
  here();
  bye();
  return 1;
}

mylib.h

#ifndef _mylib_
#define _mylib_

void hello();
void here();
void bye();

#endif

Makefile для создания статической библиотеки: Makefile

all:    myapp

#Macros

#Which Compiler
CC = g++

#Where to install
INSTDIR = /usr/local/bin

#Where are include files kept
INCLUDE = .

#Options for developement
CFLAGS = -g -Wall -ansi

#Options for release
#CFLAGS = -O -Wall -ansi

#Local Libraries
MYLIB = mylib.a

myapp:  main.o $(MYLIB)
    $(CC) -o myapp main.o $(MYLIB)

$(MYLIB):       $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o)
main.o:         main.c mylib.h
hello.o:        hello.c
here.o:         here.c
bye.o:          bye.c

clean:
    -rm main.o hello.o here.o bye.o $(MYLIB)

install:        myapp
    @if [ -d $(INSTDIR) ]; \
    then \
            cp myapp $(INSTDIR);\
            chmod a+x $(INSTDIR)/myapp;\
            chmod og-w $(INSTDIR)/myapp;\
            echo "Installed in $(INSTDIR)";\
    else \
            echo "Sorry, $(INSTDIR) does not exist";\
    fi

Проблема: когда я выполняю команду

make -f Makefile all 

Я получаю следующую ошибку зависимости:

make: Circular mylib.a <- mylib.a dependency dropped.
ar rv (hello.o) hello.o
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `ar rv (hello.o) hello.o'
make: *** [(hello.o)] Error 2

Вопросы: How do I resolve this? Which command is causing the cyclic dependency?

Ответы [ 3 ]

3 голосов
/ 16 октября 2010
#Local Libraries
MYLIB = mylib.a

myapp:  main.o $(MYLIB)
    $(CC) -o myapp main.o $(MYLIB)

$(MYLIB):       $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o)

Похоже, что последнее правило:

mylib.a: mylib.a (hello.o) mylib.a (here.o) mylib.a (bye.o)

. Это круговая зависимость.

Строка должна быть

mylib.a: hello.o here.o bye.o

Без скобок,

2 голосов
/ 16 октября 2010

Не положительно, но:

$(MYLIB):       $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o)

Если я правильно помню синтаксис моего make-файла, эта строка говорит: $(MYLIB) depends on $(MYLIB)... Что, конечно, оценивается как: mylib.a: mylib.a...

1 голос
/ 16 октября 2010

Удалите посторонние $(MYLIB) в списке зависимостей.То есть:

$(MYLIB):       $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o)

должно быть:

$(MYLIB):       hello.o here.o bye.o
...