【发布时间】:2019-03-17 01:31:07
【问题描述】:
我们有创建一个makefile的练习,它应该“创建一个项目bbfoo。bbfoo是从barbaz和foo。barbaz 是从 bar 和 baz 链接的。使用编译器 cc (这是我的 gcc system) 和链接器 ld。"
我创建了三个简单的 c 文件:
bar.c:
int one() {
return 1;
}
baz.c:
int two() {
return 2;
}
foo.c
#include <stdio.h>
int main() {
printf("bar: %d\n", one());
printf("baz: %d\n", two());
return 0;
}
以及下面的makefile:
bar: bar.c
cc -c -g -o bar.o bar.c
baz: baz.c
cc -c -g -o baz.o baz.c
barbaz: bar baz
ld -shared -o barbaz.o bar.o baz.o
foo: foo.c
cc -c -g -Wno-implicit-function-declaration -o foo.o foo.c
bbfoo: barbaz foo
ld -lc --entry=main -o bbfoo.out barbaz.o foo.o
$ 制作 bbfoo
正常工作并创建相应的文件。但是当我尝试使用
运行项目时$ ./bbfoo.out
它显示“找不到文件或文件夹”。
当我使用 gcc 时它完美无缺:
$ gcc -o bbfoo.out bar.c baz.c foo.c
$ ./bbfoo.out
栏:1
baz: 2
我的错误是什么?甚至可以链接这样的项目(分两步)?
【问题讨论】:
-
一般来说,使用 makefile 规则创建一个名称与规则目标不同的文件是不正确的。您有一个目标名称
bbfoo,但您的配方实际上创建了文件bbfoo.out。您的规则应创建bbfoo(将您的配方更改为使用-o bbfoo),否则目标名称也应为bbfoo.out。 -
感谢您的信息。我想这也是其他目标的情况吗?但这是一种形式,它可能不会改变功能。
-
发布的项目架构缺少每个子文件的头文件。然后它缺少那些头文件的
#include语句