gcc: почему не удается связать при восстановлении после изменения файла .c, но не при первоначальной сборке? - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть следующие файлы:

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

1 Ответ

0 голосов
/ 09 декабря 2018

ОК, думаю, я понял это.Похоже, это происходит из-за линтера, который есть в моем текстовом редакторе (версия Atom 1.33, версия linter 2.2.0, версия linter-gcc 0.7.1).

Когда я обновляю файл other.c вАтом и сохрани, файл other.o тоже обновляется через линтер.Если я сравниваю символы в other.o, то до него включается other_function, но после него включается _Z14other_functionv.Обновленная отметка времени на other.o также объясняет, почему make не работает gcc -c other.c.

Когда я изменяю пробельные символы с помощью другого текстового редактора, make работает правильно.

...