2016-10-24 5 views
-3

Процесс компиляции распределяется в 4 этапа:Ошибка при использовании GCC Linker под MinGW

  1. Препроцессор -Expanding Макросы и файлы заголовков.
  2. Компилятор -Converts исходный код ассемблере
  3. Assembler -Converts ассемблера в машинный код
  4. Linker -links машинный код, чтобы сформировать единый исполняемый файл.

Предполагая, что мы исходный код имя test.cpp, что нам нужно собрать поэтому команды, необходимые будут:

  1. каст test.cpp> test.i [Выход й файл, расширение заголовка файла и макросы]
  2. г ++ -S test.i [выход .с файла, язык ассемблера файл]
  3. , как -o test.o test.s [выход .o файл, зависит от машины машинный код]
  4. л.д. -o test.exe test.o [выход .exe файл, исполняемый который может быть запущена непосредственно с помощью операционной системы]

Так что проблема находится на последнем этапе я получаю следующее сообщение об ошибке :

test.o: test.cpp :(текст + 0x32):. неопределенная ссылка на __mingw_vprintf' test.o:test.cpp:(.text+0x4a): undefined reference to __main' test.o:. test.cpp :(текст + 0x75): неопределенная ссылка на std::ios_base::Init::~Init()' test.o:test.cpp:(.text+0xa5): undefined reference to станд :: ios_base :: Init :: Init() ' test.o: test.cpp :(. text + 0xb1): неопределенная ссылка на atexit' ld: test.o: bad reloc address 0x0 in section .pdata' ld: окончательная ссылка не выполнена: неверная операция

Примечание. Да, мы можем избежать этих шагов, просто используя «g ++ test.cpp», чтобы получить исполняемый файл a.exe, но цель состоит в том, чтобы понять каждый шаг процесса сборки.

+1

Вы были членом в течение 11 месяцев в соответствии с вашим профилем. Вы должны лучше знать, как задавать (и форматировать) вопросы – UnholySheep

+1

Где вы связываете стандартную библиотеку C++ (в более общем плане - время выполнения вашей инструментальной цепочки)? Почему вы вызываете 'ld' напрямую? Какова ваша цель? –

+0

@UnholySheep: согласен! я перефразирую. – Vickey

ответ

1

Связь с gcc вместо ld:

gcc -o test.exe test.o 
+0

ya, это короткий путь, я хотел знать основную работу процесса компиляции, которая включает в себя препроцессор (cpp), компилятор (gcc), ассемблер (as) и компоновщик (ld) .Now ld - это место, где я застреваю! то есть при использовании команды ld я получаю ошибку! – Vickey

+0

Вы неправильно догадались, что должно быть в командной строке 'ld'. Свяжите с 'g ++ -o test.exe test.o -Wl, -v', чтобы увидеть фактическую командную строку' ld'. –

+0

Ривьера: компиляция программы в подробном режиме (-v) дает много информации. Как я могу понять, какие библиотеки необходимы, когда я хочу создать исполняемый файл, используя ссылку linker (ld), а не общую команду g ++. – Vickey

Смежные вопросы