Ответ 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
.