Как мне диагностировать сообщение Xcode «Командный линкер не выполнен с кодом выхода 1»? - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь научить себя немного C, и я почти застрял в xCode.В настоящее время у меня есть структура папок, которая выглядит следующим образом:

enter image description here

main.c выглядит следующим образом:

#include <stdio.h>

int main(void)
{
    int dogs;

    printf("How many dogs do you have?\n");
    scanf("%d", &dogs);
    printf("So you have %d dog(s)! \n", dogs);

    return 0;
}

concrete.c выглядит так:

#include <stdio.h>
int main(void)
{
    printf("Concrete contains gravel and cement.\n");

    return 0;
}

Независимо от того, какой из них я запускаю через Product-> Run, я получаю ту же ошибку:

enter image description here

Есть идеи, что вызывает это?Исходя только из фона Python, поэтому эти ошибки и xCode в целом являются совершенно новыми для меня

EDIT - удаление файла concrete.c устранило проблему, но это не кажется мне разумным.Это потому что у меня было 2 файла с int main (void) в нем?

1 Ответ

0 голосов
/ 24 февраля 2019

Когда вы нажимаете на 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.Тем не менее, как правило, плохая практика заключается в повторном использовании хорошо известных имен специального назначения для других целей.

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