У меня есть следующие файлы:
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
и я использую этот make-файл:
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 в нерабочем случае;у них есть небольшая разница.Я понятия не имею, что вызвало бы эту разницу, и как ее интерпретировать.См. Изображение: разница между прочим, рабочим и сломанным корпусом