Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在makefile中找到用于创建静态库的递归依赖项_C_Linux_Makefile_Static Libraries - Fatal编程技术网

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

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

我有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 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 function
main':/home/usr/molly/main.c:7:undefined reference to
hello()'/home/usr/molly/main.c:8:undefined reference to
Here()/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利亚