LINUX.ORG.RU

[gcc][mingw]Не компилируются несколько объектных файлов

 ,


0

0

Есть файл error.o, в котором есть функция void die(char *str)

В файле main.o есть строчка extern void die(char *str);

При попытке это собрать

gcc -o er.exe error.o main.o

выдает

main.o:main.c:(.text+0x32): undefined reference to `die' collect2: ld returned 1 exit status

ЧЯНТД? Кроме extern нужна еще магия, чтобы вызывать функцио из другого объектного файла? Да и вообще, нужен ли этот extern? в .h файлах вроде нету и все работает?

ЗЫ: пожалуйста, не закидывайте говном за mingw

★★★★★
Ответ на: комментарий от tailgunner

>> Порядок файлов решает.

gcc -o er.exe main.o error.o

gcc -o er.exe main.o error.o

gcc main.o error.o -o er.exe

gcc error.o main.o -o er.exe

main.o:main.c:(.text+0x32): undefined reference to `die' collect2: ld returned 1 exit status

Не решает, почемута..

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

>>Ты почему-то не попробовал gcc -o er.exe main.o error.o

> как-же, пробовал

А, не заметил. Странно, должно сработать. Можно попробовать 2 вещи: если нужно просто собрать программу, не разбираясь в проблеме, попробуй сделать библиотеку из единственного файла error.o; если хочешь разобраться, запусти nm error.o - в выводе должно быть что-нибудь вроде "XXXXXXXX T die". Если такой строки нет, ты поставил на die квалификатор static :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>>запусти nm error.o - в выводе должно быть что-нибудь вроде "XXXXXXXX T die"

Упс.. Пишет "no symbols"

Скомпилил error.o еще раз, все на месте, все работает

Делаю

strip er.o

no symbols

насколько я понял стрип не надо делать для .o и .a?

Спасибо, tailgunner. Я тупой =)

makoven ★★★★★
() автор топика

И все-таки интерестно, нужен ли extern для вызова функций из друдих бъектных файлов или библиотек? в .h файлах вроде нету и все работает?

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

>> насколько я понял стрип не надо делать для .o и .a?

Конечно не надо. strip удаляет из бинарника локальные символы. В конечном бинарнике они уже не нужны, а вот при компоновке - нужны.

Deleted
()
Ответ на: комментарий от makoven

>> И все-таки интерестно, нужен ли extern для вызова функций из друдих бъектных файлов или библиотек? в .h файлах вроде нету и все работает?

Для функций ИМХО не нужен. extern нужен для объявления переменных, находящихся в других объектных файлах.

Deleted
()
Ответ на: комментарий от Deleted

формально не нужно, но имхо с ним удобнее.

anonymous
()
Ответ на: комментарий от makoven

> И все-таки интерестно, нужен ли extern для вызова функций из друдих бъектных файлов или библиотек?

вроде как для либ ты указываешь либу динамической линковки, опцией -lNN где NN - имя либы, или не так? Вот тогда он и делает связывание со своим runtime-линковщиком

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.