首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在makefile中找到用于创建静态库的递归依赖项

在makefile中找到用于创建静态库的递归依赖项
EN

Stack Overflow用户
提问于 2010-10-16 03:56:19
回答 3查看 1.6K关注 0票数 0

我有4个.c文件hello.chere.cbye.cmain.c。一个头文件mylib.h

内容如下

hello.c

代码语言:javascript
运行
复制
#include<stdio.h>

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

here.c

代码语言:javascript
运行
复制
#include<stdio.h>

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

bye.c

代码语言:javascript
运行
复制
#include<stdio.h>

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

main.c

代码语言:javascript
运行
复制
#include<stdio.h>
#include "mylib.h"

int main()
{ 

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

mylib.h

代码语言:javascript
运行
复制
#ifndef _mylib_
#define _mylib_

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

#endif

用于创建静态库的makefile是: Makefile

代码语言:javascript
运行
复制
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

问题:当我执行以下命令时

代码语言:javascript
运行
复制
make -f Makefile all 

我得到以下依赖错误:

代码语言:javascript
运行
复制
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?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-16 04:02:05

代码语言:javascript
运行
复制
#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)

看起来最后一条规则是

代码语言:javascript
运行
复制
mylib.a: mylib.a (hello.o) mylib.a (here.o) mylib.a (bye.o)

这是一种循环依赖。

这行应该是

代码语言:javascript
运行
复制
mylib.a: hello.o here.o bye.o

不带括号。

票数 3
EN

Stack Overflow用户

发布于 2010-10-16 04:01:39

不是肯定的,但是:

代码语言:javascript
运行
复制
$(MYLIB):       $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o)

如果我没记错makefile语法,该行代码是$(MYLIB) depends on $(MYLIB)...,它的计算结果当然是:mylib.a: mylib.a...

票数 2
EN

Stack Overflow用户

发布于 2010-10-16 04:02:09

在依赖项列表中删除无关的$(MYLIB)。这就是:

代码语言:javascript
运行
复制
$(MYLIB):       $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o)

应该是:

代码语言:javascript
运行
复制
$(MYLIB):       hello.o here.o bye.o
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3945650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档