GCC 4.2 Ошибка сборки - PullRequest
       11

GCC 4.2 Ошибка сборки

0 голосов
/ 02 апреля 2010

Я строю проект C с Xcode, и когда я его собираю, он выдает мне эту ошибку:

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

Спасибо!

Ответы [ 3 ]

1 голос
/ 02 апреля 2010

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

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

1 голос
/ 02 апреля 2010

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

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

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

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

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

0 голосов
/ 02 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...