давайте проанализируем & quot; collect2: ld вернул 1 статус выхода & quot ;?

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

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

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

14

Решение

Перво-наперво, вы должны знать, что программы командной строки с именем 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,

22

Другие решения

Поскольку 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

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

3

По вопросам рекламы [email protected]