Я знаю, что это указывает на проблему с компоновщиком, в основном это неразрешенные символы. Я знаю, что для решения этой проблемы / избавления от этого сообщения об ошибке нужно было бы предоставить гораздо больше информации. Я знаю, что есть много вопросов по решению этих проблем на SO.
Мои вопросы направлены на то, чтобы помочь понять make и ld, выяснить, что (и кто) пытается выразить то, что с помощью этой строки.
collect2: ld returned 1 exit status
Перво-наперво, вы должны знать, что программы командной строки с именем gcc
а также g++
являются только зонтиком (обертками) вокруг фактических команд препроцессора / анализатора-компилятора / ассемблера / компоновщика. Их настоящее имя cpp
, cc1
или же cc1plus
, as
а также ld
соответственно. GCC помогает унифицировать их использование, интерфейс командной строки и предоставляет значимый набор стандартных (и обязательных) для них опций. Например, очень трудно напрямую связать двоичный файл с помощью ld — если ld не запускается со всеми 20+ (IIRC) правильными параметрами, он просто не работает.
Теперь, когда вы это знаете, вы можете увидеть:
Это значит, что я использую ld? Я сконфигурировал свой проект / Makefile так, чтобы g ++ выполнял связывание, так почему LD все еще участвует
Это скорее означает, что вы вызываете GCC, но, в свою очередь, вызывает LD. Сам GCC ничего не знает — ни компиляция, ни компоновка, так как это просто оболочка. (Иди сделай wc -c
на /usr/bin/gcc
и удивляйтесь, что это всего несколько килобайт! Теперь сделайте то же самое для /usr/libexec/gcc/cc1plus
и узнайте ужасающую правду: это несколько десятков мегабайт!)
Что значит «collect2:»? Это шаг, который вызывает make? Я не могу найти исполняемый файл с таким именем в моей системе.
Collect2 — это еще один уровень косвенности между gcc и ld. Подробнее об этом на своем официальном сайте.
Кто пишет это сообщение? делать ? лд? г ++?
Либо g ++ (это все, насколько я знаю), либо collect2
сам может быть.
Есть ли значимый список возможных кодов выхода?
Смысл общепринятый — ноль означает успех, ненулевой означает неудачу. Если существует исчерпывающий список, его можно просмотреть, вызвав man ld
,
Поскольку H2CO3 ссылается на, и чтобы понять, как трудно будет вручную связать, попробуйте запустить g ++ с ключом verbose (-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
…для фазы связывания.