Что означает ошибка времени компиляции "Неопределенные символы для архитектуры x86_64"? - PullRequest
34 голосов
/ 09 декабря 2011

Я пытаюсь запрограммировать класс графа, используя смежный список из примера в моем учебнике по C ++, и когда я компилирую с помощью этой команды: Код: g ++ -o prog program.cpp ... Я получаю следующую ошибку:

Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

... что в мире это значит?Это может оказаться проблемой с моим кодом, но я чувствую, что это может быть глубже, потому что я получил ту же самую, казалось бы, необъяснимую ошибку для нескольких различных проектов, многие из которых были решены по-разному, и, к сожалению, полностьюслучайно.

Я где-то читал, что это может иметь отношение к тому, использую ли я 32-битные или 64-битные библиотеки, и что могут потребоваться теги -m32 или -m64, но яне уверен, если это применимо здесь.Интересно, что когда я пытался добавить тег -m64, я получал ту же самую ошибку, но когда я пытался использовать тег -m32, я получал ту же ошибку, за исключением того, что вместо нее говорилось

Undefined symbols for architecture i386:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

.

В основном я просто хочу знать, что в мире говорит ошибка.Я привык отлаживать ошибки во время компиляции, которые дают определенную строку в коде и т. Д., Но я не могу ничего подобного из этого различить.Любые идеи?

Если это поможет, я использую Macbook конца 2008 года с Intel Core 2 Duo (64-битный), и я использую OS X Lion (10.7.2), который ядумаю, это последняя версия.Также я использую gcc версии 4.2.1.

1 Ответ

41 голосов
/ 28 июня 2012

Когда вы компилируете файл, компилятор вызывает компоновщик, который пытается сгенерировать исполняемый файл. Но это невозможно, потому что вы не предоставили функцию с именем main, которая будет выполняться при запуске вашей программы.

Либо вы не хотите запускать компоновщик, потому что вы хотите скомпилировать несколько файлов отдельно, а затем объединить. В этом случае используйте флаг -c, чтобы указать компилятору пропустить этап ссылки.

Или вы хотите выполнить скомпилированный файл. Затем вам нужно реализовать функцию main.

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