gcc:为什么在更改.c文件后进行重建时链接失败,而在最初进行构建时却失败?

时间:2018-12-09 15:56:10

标签: c gcc linker-errors ld

我有以下文件:

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

1 个答案:

答案 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正常工作。