我有以下文件:
main.c
#include "other.h"
int main(int argc, char *argv[]) {
other();
return 0;
}
other.c
#include "other.h"
void other(void) {
1+1;
}
other.h
#ifndef OTHER_H
#define OTHER_H
void other(void);
#endif
并且我正在使用此生成文件:
OBJ = other.o main.o
main: $(OBJ)
gcc $(OBJ) -o $@
main.o: main.c
gcc -c main.c
other.o: other.c
gcc -c other.c
clean:
rm -f $(OBJ) main
当我运行make clean && make
时,所有内容都会成功编译并链接。
然后,我将空白更改为other.c
。
现在,当我运行make
时,出现以下错误:
gcc other.o main.o -o main
main.o: In function `main':
main.c:(.text+0x5): undefined reference to `other'
collect2: error: ld returned 1 exit status
Makefile:6: recipe for target 'main' failed
make: *** [main] Error 1
为什么更新other.c
后链接失败?
请注意,如果我将空白更改为main.c
,或者再次运行make clean
,则链接有效。
更新:如果有用,我将工作情况下的other.o文件与损坏情况下的other.o文件进行了比较;他们有细微的差别。我不知道是什么会导致这种差异,也不知道如何解释。查看图片:difference between other.o, working case and broken case
答案 0 :(得分:1)
好的,我想我明白了。这似乎是由于我的文本编辑器(Atom版本1.33,linter版本2.2.0,linter-gcc版本0.7.1)中存在的linter而引起的。
当我在Atom中更新文件other.c并保存时,文件other.o
也通过短绒进行了更新。如果我比较other.o
中的符号,则在包含other_function
之前,但在包含_Z14other_functionv
之后。 other.o
上更新的时间戳也解释了为什么make
没有运行gcc -c other.c
。
当我使用其他文本编辑器更改空格时,make
正常工作。