2008-11-17 3 views
1

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

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.c выход из системы, но я искал main.c для текста «выхода из системы» и ничего не нашел (функция даже не звонил!).

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

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

+0

из любопытства, вы #include logoff.c в main.c? – 2008-11-17 22:18:58

+0

Это ваша проблема. Переместите объявления в файл заголовка, такой как logoff.h, и он будет компилироваться в порядке. – 2008-11-17 23:20:13

ответ

2

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

void logoff(void);

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

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

2

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

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