Подтвердить что ты не робот

Пусть проанализировать "collect2: ld возвращен 1 статус выхода"?

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

Мои вопросы направлены на то, чтобы помочь понять make и ld, чтобы выяснить, что (и кто) пытается выразить то, что с этой линией.

collect2: ld returned 1 exit status
  • Что означает "collect2:"? Вызывается ли этот шаг? Я не могу найти исполняемый файл с этим именем в моей системе.
  • Это означает, что я использую ld? Я сконфигурировал свой проект /Makefile, чтобы g++ выполнял привязку, поэтому почему LD все еще участвует
  • Кто пишет это сообщение? делать? ld? g++?
  • Есть ли значимый список возможных кодов выхода?
4b9b3361

Ответ 1

Прежде всего, вам нужно знать, что программы командной строки с именем gcc и g++ являются только зонтичными (обертками) вокруг фактических команд препроцессора/парсера-компилятора/ассемблера/компоновщика. Их настоящее имя cpp, cc1 или cc1plus, as и ld соответственно. GCC помогает в унификации их использования, интерфейсе командной строки и предоставлении значимого набора значений по умолчанию (и необходимых) для них. Например, очень сложно связать двоичный файл напрямую с помощью ld - если ld не запускается со всеми 20+ (IIRC) правильными параметрами, он просто не работает.

Теперь, когда вы это знаете, вы можете увидеть:

Это означает, что я использую ld? Я сконфигурировал свой проект /Makefile, чтобы g++ делал ссылку, поэтому почему LD все еще участвует

Это скорее означает, что вы вызываете GCC, но в свою очередь он вызывает LD. Сам GCC ничего не знает - ни компиляция, ни связывание, а просто оболочка. (Go do a wc -c on /usr/bin/gcc и удивляйтесь, что это всего лишь несколько килобайт! Теперь сделаем то же самое для /usr/libexec/gcc/cc1plus и узнаем ужасающую правду: это несколько мегабайт в 10 мегабайт!)

Что означает "collect2:"? Вызывается ли этот шаг? Я не могу найти исполняемый файл с этим именем в моей системе.

Collect2 также является еще одним уровнем косвенности между gcc и ld. Подробнее об этом на официальном сайте.

Кто пишет это сообщение? делать? ld? g++?

Либо g++ (что он, насколько я знаю), либо collect2 сам может быть.

Есть ли значимый список возможных кодов выхода?

Значение условно - ноль означает успех, отличное от нуля означает отказ. Если существует исчерпывающий список, он должен быть доступен, вызывая man ld.

Ответ 2

Как упоминает H2CO3, и чтобы понять, как трудно было бы связать вручную, попробуйте запустить g++ с помощью подробного переключателя (-v). Он выведет команды (вместе с некоторой другой информацией) для всех этапов процесса (предварительная обработка, компиляция, сборка, ссылка).

Например, построение простого "Hello, World" с g++ на Cygwin дает:

/usr/lib/gcc/i686-pc-cygwin/3.4.4/collect2.exe -Bdynamic --dll-search-prefix=cyg
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../crt0.o -L . -L/usr/lib/gcc/i686-pc-cygwin/3.4.4
-L/usr/lib/gcc/i686-pc-cygwin/3.4.4 -L/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../..
/tmp/cc4btl0k.o -lfoo -lstdc++ -lgcc -lcygwin -luser32 -lkernel32 -ladvapi32 -lshell32 -lgcc

... для фазы связывания.