Когда вы нажимаете на Xcode отображение «Ошибка команды компоновщика с кодом выхода 1», он должен показывать вам часть журнала компоновки, где компоновщик отображает сообщения и завершает работу с кодом 1.
Эти сообщенияinclude:
duplicate symbol _main in:
[Some path on your system…]/Build/Intermediates.noindex/foo.build/Debug/foo.build/Objects-normal/x86_64/foo.o
[Some path on your system…]/Build/Intermediates.noindex/foo.build/Debug/foo.build/Objects-normal/x86_64/main.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Это сообщение «дубликат символа _main» говорит вам о проблеме: у вас есть два определения main
.main
- это имя уникальной подпрограммы, которая вызывается для запуска вашей программы, и у вас должно быть только одно ее определение.
Дополнение
По умолчанию в C имена функций имеютвнешняя связь, означающая одно и то же имя в разных единицах перевода (исходные файлы, если они используются в обычном режиме), относится к одной и той же вещи.Таким образом, не может быть двух функций с одним и тем же именем - любого имени, а не просто main
- потому что тогда у вас есть две вещи с одинаковым именем.Вы можете присвоить функции внутреннюю связь вместо внешней, объявив ее статической, и тогда это имя не будет конфликтовать с тем же именем в других единицах перевода.
Тем не менее, определяя static
версию main
может привести к жалобам компилятора как о том, что main
не должно быть объявлено с static
, так и о том, что оно должно быть объявлено как возвращающее int
, если вы объявили это иначе.Они вытекают из текста в стандарте C, в C 2018 5.1.2.2.1 1:
Функция, вызываемая при запуске программы, называется main
.Реализация не объявляет прототип для этой функции.Он должен быть определен с типом возврата int
и без параметров:… или с двумя параметрами (именуемыми здесь argc
и argv
, хотя могут использоваться любые имена, так как они являются локальными для функции вкоторые они объявили):…
Хотя этот текст ограничивает объявление main
, мне кажется, что его можно интерпретировать как ссылку на main
с внешней связью, а не на какую-либорутина, объявленная main
.Тем не менее, как правило, плохая практика заключается в повторном использовании хорошо известных имен специального назначения для других целей.