【发布时间】:2019-11-06 18:22:28
【问题描述】:
我正在尝试了解 Makefile 的工作原理,因此我决定用一个非常简单的代码进行尝试。这是我写的:
/* justify.c */
#include <stdio.h>
#include "line.h"
#include "word.h"
int main(void) {
printf("I'm in the main.\n");
read_word();
write_line();
}
/* line.h */
void write_line(void);
/* line.c */
#include <stdio.h>
#include "line.h"
void write_line(void) {
printf("write_line\n");
}
/* word.h */
void read_word(void);
/* word.c */
#include <stdio.h>
#include "word.h"
void read_word(void) {
printf("read_word\n");
}
现在......如果我从终端做所有事情,它就可以工作:
> gcc -c justify.c
> gcc -c line.c
> gcc -c word.c
> gcc -o justify justify.c line.c word.c
但如果我尝试使用 Makefile 做所有事情,它会给我一个错误:
# Makefile
justify: justify.o line.o word.o
gcc -o justify.o line.o word.o
justify.o: justify.c line.h word.h
gcc -c justify.c
line.o: line.c line.h
gcc -c line.c
word.o: word.c word.h
gcc -c word.c
> make justify
Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
【问题讨论】:
-
您应该将包含保护添加到
*.h文件中,并将它们从makefile 中的依赖项中删除。并不是说它与您的问题有关 -
gcc -o justify.o line.o word.o->gcc -o justify justify.o line.o word.o -
检查
gcc -o行。那不应该是gcc -o justify justify.o line.o word.o -
谢谢大家,包括你 Eugene Sh。 “包含守卫”非常有趣。
-
@tkausl 指出的问题虽然有效,但无法解释您看到的消息,所以发生了其他事情。看起来 line.o 是为另一个架构编译的。做一个
objdump -f line.o。然后删除 .o 文件,并从命令行重新编译并再次检查。如果 makefile 产生的输出与命令行不同,请尝试从 shell 和 makefile 配方运行which gcc以查看路径是否存在问题。