2010-04-02 4 views
0

я строю проект C с Xcode, и когда-либо я строить это дает мне эту ошибку:GCC 4.2 Сложение ошибка

ld: duplicate symbol _detectLinux in /Users/markszymanski/Desktop/Programming/C/iTermOS/build/iTermOS.build/Debug/iTermOS.build/Objects-normal/i386/linuxDetect.o and /Users/markszymanski/Desktop/Programming/C/iTermOS/build/iTermOS.build/Debug/iTermOS.build/Objects-normal/i386/iTermOS.o

спасибо!

ответ

1

Это означает, что вы определили тот же символ с глобальной областью в (по крайней мере) два различных исходных файлов - либо функции или глобальной переменной называется _detectLinux, и, видимо, в файлах linuxDetect.c и iTermOS.c.

Как исправить это зависит от того, как вы собираетесь использовать этот символ:

  • Если вы имели в виду, чтобы определить его в один файл и использовать его в другой файл, объявить его extern в другом файле.

  • Если вы только намерены использовать символ в объявленном файле, вы можете объявить его static.

  • Если символ определен в обоих файлах, вы можете переименовать символ в один (или оба) файла.

+0

Я объявил это как «статический», и теперь он работает, спасибо! –

0

Ну, это не так много информации для продолжения. Как говорит ошибка, символ _detectLinux включен как в linuxDetect.o, так и в iTermsOS.o, и когда вы пытаетесь связать их вместе, возникает конфликт, поскольку компоновщик не знает, какой из двух символов использовать. Это может произойти, если вы, например, имеете глобальную переменную с этим именем в файле .h, который используется для сборки обоих файлов вместо объявления его в одном месте и объявления его как «extern» в файле .h.

Что вам нужно сделать, это посмотреть, где первоначально объявлен символ _detectLinux, а затем проследить зависимости для linuxDetect.o и iTermOS.o, чтобы понять, почему он включен публично в обоих.

1

Если _detectLinux является функцией, один из распространенных способов получить эту проблему - определить ее в файле заголовка, но забудьте отметить ее встроенную. Это заставит его генерировать код функции в каждом файле, который включает заголовок (предположительно _detectLinux.c и iTermsOS.c).

Возможно, вы скопировали все тело функции между двумя исходными файлами вместо простого объявления функции в iTermsOS.c, где я ожидаю, что она будет вызвана.

Смежные вопросы