C 在makefile中找到用于创建静态库的递归依赖项
我有4个.c文件C 在makefile中找到用于创建静态库的递归依赖项,c,linux,makefile,static-libraries,C,Linux,Makefile,Static Libraries,我有4个.c文件hello.c,here.c,bye.c和main.c。 一个头文件mylib.h 内容如下: 你好,c #include<stdio.h> void hello() { printf("Hello!\n"); } 用于创建静态库的makefile是: 生成文件 问题:当我执行命令时 make -f Makefile all 我得到以下依赖性错误: make: Circular mylib.a <- mylib.a dependency drop
hello.c
,here.c
,bye.c
和main.c
。
一个头文件mylib.h
内容如下:
你好,c
#include<stdio.h>
void hello()
{
printf("Hello!\n");
}
用于创建静态库的makefile是:
生成文件
问题:当我执行命令时
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
make:Circular mylib.a非阳性,但:
$(MYLIB): $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o)
如果我没有记错我的makefile语法,那一行说,$(MYLIB)依赖于$(MYLIB).
,当然它的计算结果是:MYLIB.a:MYLIB.a.。
不是正的,但是:
$(MYLIB): $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o)
#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)
如果我没有记错我的makefile语法,那一行说,$(MYLIB)依赖于$(MYLIB).
,它的计算结果当然是:MYLIB.a:MYLIB.a.
#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
没有括号
看起来最后一条规则是
mylib.a: mylib.a (hello.o) mylib.a (here.o) mylib.a (bye.o)
这是一个循环依赖项
线路应该是
mylib.a: hello.o here.o bye.o
没有括号 在依赖项列表中删除无关的$(MYLIB)
。即:
$(MYLIB): $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o)
应该是:
$(MYLIB): hello.o here.o bye.o
在依赖项列表中删除无关的$(MYLIB)
。即:
$(MYLIB): $(MYLIB)(hello.o) $(MYLIB)(here.o) $(MYLIB)(bye.o)
应该是:
$(MYLIB): hello.o here.o bye.o
我想澄清一下,你想要的是:$(MYLIB):main.o你好。o这里。o再见。
@Bryan:我认为这不是问题。这是一种让库知道它应该包含哪些对象文件的方法。@永恒学习者:makefile语法是target:dependencies
。。。如果您的目标是将hello.o、here.o和bye.o编译成单个.a文件,那么这不是正确的方法。这一行所做的就是说明$(MYLIB)依赖于哪些文件,而现在,$(MYLIB)依赖于$(MYLIB),后者是递归的。我想真正的问题归结为,你在这一行上想做什么?如果你只是想说“mylib.a依赖于我用来编译.a的.o文件”,那么。。。在重新编译时,.a仍将更改,因此文件本身将过期。不管怎样,我很确定这就是你的递归错误的来源。@布赖恩:我做了你建议的更改。我得到了文件未找到的错误:`gcc-o myapp main.o mylib.a gcc:mylib.a:没有这样的文件或目录:**[myapp]错误1`,我想澄清一下,你想要的是:$(mylib):main.o你好。o这里。o拜拜。o
@Bryan:我不认为这是个问题。这是一种让库知道它应该包含哪些对象文件的方法。@永恒学习者:makefile语法是target:dependencies
。。。如果您的目标是将hello.o、here.o和bye.o编译成单个.a文件,那么这不是正确的方法。这一行所做的就是说明$(MYLIB)依赖于哪些文件,而现在,$(MYLIB)依赖于$(MYLIB),后者是递归的。我想真正的问题归结为,你在这一行上想做什么?如果你只是想说“mylib.a依赖于我用来编译.a的.o文件”,那么。。。在重新编译时,.a仍将更改,因此文件本身将过期。不管怎样,我很确定这就是你的递归错误的来源。@布赖恩:我做了你建议的更改。我得到了文件未找到的错误:`gcc-o myapp main.o mylib.a gcc:mylib.a:没有这样的文件或目录:**[myapp]错误1`顺便说一句,使用g++
是一个C
程序的编译器是一个滥杀。它将把二进制/库与标准的C++运行时( LBSTSTD++/<代码>)链接,这在代码> C<代码>中不需要。用CC=gcc
替换CC=g++
应该可以解决这个问题。改为gcc-问题持续存在顺便说一句,使用g++
是一个C
程序的编译器是一个过度使用。它将把二进制/库与标准的C++运行时( LBSTSTD++/<代码>)链接,这在代码> C<代码>中不需要。将CC=g++
替换为CC=gcc
应该可以解决此问题。更改为gcc-问题持续存在我认为这不是问题。这是一种让库知道它应该包含哪些对象文件的方法。我不认为这是一个问题。这是一种让库知道它应该包含哪些对象文件的方法。@nategoose:我认为这不是问题。这是一种让库知道它应该包含哪些对象文件的方法。mylib.a永远不能比它自己旧。它应该只在:
的左边,请参见编辑。@natgoose:我做了建议的更改,得到了以下错误gcc-o myapp main.o mylib.a gcc:mylib.a:没有这样的文件或目录生成:**[myapp]错误1@Eternal学习者:但是你不再犯错误了。使用操作ar rcs$@$^
跟进上述行。这将建立您的库。$@
符号变成当前规则的目标名称,$^
变成构建该目标所需的文件($@
在:
的左边,$^
是:
的右边)。@nategoose:添加了这行并得到一个错误:“未定义的引用”下面是完整的消息:ar rcs mylib.a hello.o Here.o bye.o gcc-o myapp main.o mylib.a main.o:In functionmain':/home/usr/molly/main.c:7:undefined reference to
hello()'/home/usr/molly/main.c:8:undefined reference toHere()/home/usr/molly/main.c:9:undefined reference to
bye()'main.o:(.eh\u frame+0x12):未定义对“\uuuu gxx\u personality\u v0”集合的引用2:ld返回了1个退出状态make:**[myapp]错误1@nategoose当前位置我认为这不是问题。这是一种让库知道它应该包含哪些对象文件的方法。mylib.a永远不能比它自己旧。它应该只在:
的左边,请参见编辑。@natgoose:我做了建议的更改,得到了以下错误gcc-o myapp main.o mylib.a gcc:mylib.a:没有这样的文件或目录生成:**[myapp]错误1@Eternal利亚