Странная ошибка ld по поводу дублированного символа

StackOverflow https://stackoverflow.com/questions/297162

Вопрос

У меня есть проект, состоящий из двух файлов, main.c и logoff.c. Когда я пытаюсь скомпилировать их, я получаю эту ошибку:

gcc -c -g -Wall main.c
gcc -c -g -Wall logoff.c
gcc -o main -g -Wall main.o logoff.o
ld: duplicate symbol _logoff in logoff.o and main.o

У меня есть функция logoff в logoff.c, но я искал в main.c текст " logoff " и ничего не нашли (функция еще даже не вызывается!).

Если я изменю имя функции на log_off, это сработает. В файле есть вторая функция, которая затем вызывает ту же ошибку, если ее имя также не изменено.

Есть ли причина, по которой это может произойти? У меня есть эта проблема на двух разных системах. Одна вещь, которая может иметь значение, заключается в том, что я использовал тот же файл logoff.c в другом проекте, но он не связан с этим.

Это было полезно?

Решение

Создайте файл logoff.h только с объявлением функции выхода из системы, например

void logoff (void);

Затем в main.c включите его с помощью #include " logoff.h " . Не включайте logoff.c, так как компилятор скомпилирует функцию два раза, а компоновщик увидит две функции с таким именем.

Похоже, что это работает, если вы измените его на log_off, а затем перекомпилируете только один из них. В другом объектном файле все еще будет скомпилирована старая функция выхода из системы. Таким образом, компоновщик видит один log_off и один logoff. Вот почему это работает для вас с этим именем.

Другие советы

Вы #include или #import logoff.c в main.c?

Ты сделал - ну, это твоя проблема. logoff.c включен в main.c, поэтому main определяет _logoff и _main. Теперь вы также компилируете logoff.c, который определяет _logoff. Затем вы пытаетесь связать их, что означает, что получаемый двоичный файл содержит символы _main, _logoff и _logoff, о чем и говорит вам компоновщик.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top