LINUX.ORG.RU

GCC undefined reference


0

0

Есть куча объектников но при их сборке компилер ругается на экспортируемые каждым объектником функции, при этом другими компиляторами вроде borland этот код собирается нормально. Такое впечатление что компилятор не ищет соответстия функциям в разных объектниках. Все собираю в один файл. Если пробовать делать либы то он их съедает но рождает конечный файл который содержит ссылки на либы что тупо. (.rodata+0x6c): undefined reference to `SysKeyboardHandler'


Re: GCC undefined reference

без маленького примера который бы выдавал подобные ошибки вряд ли вы получите ответ.

fghj ★★★★★ ()
Ответ на: Re: GCC undefined reference от fghj

Re: GCC undefined reference

А лучше и не маленького примера, а солидного, демонстрирующего проблему во всей полноте.

tailgunner ★★★★★ ()
Ответ на: Re: GCC undefined reference от tailgunner

Re: GCC undefined reference

есть допустим пара объектников 1 и 2. Первый экспортирует функцию из второго как extern void obj_1_func(void); Во втором определена эта функция. Если собирать сначала второй а потом первый то он не види функцию. А у меня объектники все друг на друге завязаны и нету "начала цепочки".

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

> есть допустим пара объектников 1 и 2. Первый экспортирует функцию из второго как extern void obj_1_func(void);

Как всё запутано. Наверное, ты хотел написать "импотрирует из второго". Но что в этом контексте означает "собирать второй, а потом первый"? У тебя кто вообще выдает ошибки - компилятор или линковщик? Не пытайся сам сформулировать проблему, у тебя не получается. Запости команды и сообщения об ошибках.

tailgunner ★★★★★ ()
Ответ на: Re: GCC undefined reference от tailgunner

Re: GCC undefined reference

gcc все съедает. Когда я скармливаю все объектники линковщику ld возникает эта проблема. Т.е. когда он видит файл импортирующий функцию он пишет что такой функции нет хотя она в другом объектнике.

NoName ()
Ответ на: Re: GCC undefined reference от tailgunner

Re: GCC undefined reference

c032.o:(.text+0x95): undefined reference to `_SysInterruptMask' c032.o:(.text+0xbc): undefined reference to `_SysTimerInit' c032.o:(.text+0xc1): undefined reference to `_SysKeyboardDriverInit' c032.o:(.text+0xef): undefined reference to `_SysPrepTasks' c032.o:(.text+0x135): undefined reference to `_SysPrepGdt' c032.o:(.text+0x19f): undefined reference to `_SysVectInit'

NoName ()

Re: GCC undefined reference

undefined reference - обычно выдает линковщик. => попробуй сгенерить отдельные объектники (gcc -c myfile.c -o myfile.o), а потом их все слинковать(gcc myfile1.o myfile2.o myfile3.o -o all_my_files).

Можно так-же компилить все взаимозависимые файлы одной коммандой.

gcc myfile1.c myfile2.c myfile3.c -o all_my_files

YesSSS ★★★ ()
Ответ на: Re: GCC undefined reference от YesSSS

Re: GCC undefined reference

>gcc myfile1.o myfile2.o myfile3.o -o all_my_files он вызывает ld и получается тоже самое

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

_SysInterruptMask, _SysKeyboardDriverInit... - твои или библиотечные функции?

YesSSS ★★★ ()

Re: GCC undefined reference

Sozdayte lib`u so wsemi nugnimi funkcijami/procedurami/moduljami
zatem linkuyte s etoy liboy.

gcc program.c -LPATH_TO_YOUR_LIB -lname_of_your_lib
P.s. esli zabili kak lib`ui sdelat`:
ar cr name_of_your_lib.a object_1.o ... object_n.o
P.s.s.
naprimer, tri fayla w proekte (1.c 2.c 3.c) w kotorix washi funkcii sobiraem w lib`u
gcc -c 1.c
gcc -c 2.c
gcc -c 3.c
ar cr libsimple.a 1.o 2.o 3.o
zatem kompilliruem programmu, w kotoroy ispol`zujutsja washi funkcii opisannie w [1-3].c

gcc my_program.c -L./ -lsimple

Da, ls *.c
1.c
2.c
3.c
my_program.c

Inimi slowami, w tekushey direktorii.

Proshu izvinit` translit,
Vic.


psi ()

Re: GCC undefined reference

решается твой трабл путём двойного указания одного из обьектников типа:

gcc -o out out1.o out2.o out1.o

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

Ничего не получается :( У меня 23 объектника и все друг на друге завязаны. Какой критерий выбора?

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

попробуй их последовательность указать два или более раз подряд

или сделай с них шаренную либу а там динамический линкер сам разберётся

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

и загони основной обтьём своих обьектников если не в динамическую то хоть в статическую либу. при таком количестве сильно упрощает жизнь

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

если линковать с либой то он съедает и создает конечный файл с размером около 300 байт в котором как то сделаны ссылки на либы. -static не помогает.

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

хех если сделать *.o он и map файл создает в котором пишет все функции хотя ругается что их нет.

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

ГДЕ Makefile?

где вывод make?

или ты всё это вручную линкуеш? где тогда скриншоты?

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

DIR_INCLUDE =./INCLUDE KERN_INCLUDE =./Kern44/INCLUDE

INIT=./OSINIT/ KERNEL=./Kern44/ LIB=./LIB/ TOOLS=./TOOLS/ VERSION=./VERSION/

PARAMS = -c -O2 -I $(DIR_INCLUDE) CC = gcc $(PARAMS) OUTOSNAME=OS.elf LINK = ld --verbose -Map OS.map -o$(OUTOSNAME) --script ld.conf ASM = ./BIN/fasm

all: $(CC) -std=c99 $(INIT)*.c $(CC) $(INIT)asm/*.c $(ASM) $(INIT)asm/c032.asm ./c032.o $(ASM) $(INIT)asm/timer.asm ./timer.o $(ASM) $(INIT)asm/keyboard.asm ./keyboard.o $(ASM) $(INIT)asm/handles.asm ./handles.o $(ASM) $(INIT)asm/setirqs.asm ./setirqs.o $(ASM) $(INIT)asm/v86subrs.asm ./v86subrs.o $(ASM) $(INIT)asm/fpemu.asm ./fpemu.o # ar cr INIT.lib *.o # rm -f *.o

$(CC) -I $(KERN_INCLUDE) -std=c99 $(KERNEL)*.c $(CC) -I $(KERN_INCLUDE) $(KERNEL)asm/*.c # ar cr KERNEL.lib *.o # rm -f *.o

$(CC) -std=c99 $(LIB)*.c # ar cr LIB.lib *.o # rm -f *.o

$(CC) -std=c99 $(TOOLS)*.c $(ASM) $(TOOLS)sysout.asm ./sysout.o # ar cr TOOLS.lib *.o # rm -f *.o

$(CC) $(VERSION)*.c # ar cr VERSION.lib *.o # $(CC) tasks.c -L./ -llibos.a

$(LINK) *.o

# $(LINK) *.o tasks.o # $(LINK) -e SysTask00 *.lib # $(LINK) tasks.o # $(LINK) tasks.o OSROM.o OSRAM.o tasks.o \ #kernram.o kernrom.o disp.o dirvs.o subr.o thunks.o

# $(LINK) kernram.o kernrom.o disp.o dirvs.o subr.o thunks.o # $(LINK) c032.o setirqs.o keyboard.o timer.o handles.o v86subrs.o fpemu.o rm -f *.o debug: # $(CC) -S -std=c99 $(PARAMS) $(SRC_LIB)

clean: rm -vf *~ rm -vf *.s rm -vf *.txt rm -vf *.map rm -vf *.lib rm -vf *.o rm -vf $(OUTOSNAME)

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

а теперь научись выбирать на кнопкой post "preformated text"

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

DIR_INCLUDE =./INCLUDE
KERN_INCLUDE =./Kern44/INCLUDE

INIT=./OSINIT/
KERNEL=./Kern44/
LIB=./LIB/
TOOLS=./TOOLS/
VERSION=./VERSION/

PARAMS = -c -O2 -I $(DIR_INCLUDE)
CC = gcc $(PARAMS)
OUTOSNAME=OS.elf
LINK = ld --verbose -Map OS.map -o$(OUTOSNAME) --script ld.conf
ASM = ./BIN/fasm

all:
	$(CC) -std=c99 $(INIT)*.c
	$(CC) $(INIT)asm/*.c
	$(ASM) $(INIT)asm/c032.asm ./c032.o
	$(ASM) $(INIT)asm/timer.asm ./timer.o
	$(ASM) $(INIT)asm/keyboard.asm ./keyboard.o
	$(ASM) $(INIT)asm/handles.asm ./handles.o
	$(ASM) $(INIT)asm/setirqs.asm ./setirqs.o
	$(ASM) $(INIT)asm/v86subrs.asm ./v86subrs.o
	$(ASM) $(INIT)asm/fpemu.asm ./fpemu.o
#	ar cr INIT.lib *.o
#	rm -f *.o

	$(CC) -I $(KERN_INCLUDE) -std=c99 $(KERNEL)*.c
	$(CC) -I $(KERN_INCLUDE) $(KERNEL)asm/*.c
#	ar cr KERNEL.lib *.o
#	rm -f *.o

	$(CC) -std=c99 $(LIB)*.c
#	ar cr LIB.lib *.o
#	rm -f *.o

	$(CC) -std=c99 $(TOOLS)*.c
	$(ASM) $(TOOLS)sysout.asm ./sysout.o
#	ar cr TOOLS.lib *.o
#	rm -f *.o

	$(CC) $(VERSION)*.c
#	ar cr VERSION.lib *.o
#	$(CC) tasks.c -L./ -llibos.a

	$(LINK) *.o

#	$(LINK) *.o tasks.o
#	$(LINK) -e SysTask00 *.lib
#	$(LINK) tasks.o
#	$(LINK) tasks.o OSROM.o OSRAM.o tasks.o \
#kernram.o kernrom.o disp.o dirvs.o subr.o thunks.o

#	$(LINK) kernram.o kernrom.o disp.o dirvs.o subr.o thunks.o
#	$(LINK) c032.o setirqs.o keyboard.o timer.o handles.o v86subrs.o fpemu.o
	rm -f *.o
debug:
#	$(CC) -S -std=c99 $(PARAMS) $(SRC_LIB)

clean:
	rm -vf *~
	rm -vf *.s
	rm -vf *.txt
	rm -vf *.map
	rm -vf *.lib
	rm -vf *.o
	rm -vf $(OUTOSNAME)

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

fasm не понимает списка имен, я по этому поводу высказывал свое мнение на официальном форуме но тему почему то недавно снесли.

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

первый шаг навстречу ответу ты уже сделал.

а теперь все ждут полного вывода команды make и ктомуже такого же красивого

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

Еще хотелось бы видеть выдачу линковщика - можно не всю, но с самого начала.

По Makefile: как я понимаю, объектники, откомпилированные из исходников в разных каталогах, ложаться в один каталог. Нет ли у тебя файлов с одинаковыми именами, так что объектники затираются?

># $(CC) tasks.c -L./ -llibos.a

Я понимаю, что строка закомментирована, но это неправильная команда: вместо -llibos.a должно быть -los

tailgunner ★★★★★ ()
Ответ на: Re: GCC undefined reference от tailgunner

Re: GCC undefined reference

>Еще хотелось бы видеть выдачу линковщика - можно не всю, но с самого начала.

makefile какбудто содержит вызов линкера.

я думаю что хвост возможно окажется никак не лишним

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

С такой строчкой в Makefile
	ar cr libos.a *.o
	$(CC) tasks.c -L./ -los
/* --------------------------------------------------- */
Script started on Пнд 24 Июл 2006 14:14:07
gcc -c -O2 -I ./INCLUDE -std=c99 ./OSINIT/*.c

In file included from ./OSINIT/v86func.c:12:

./INCLUDE/compiler.h:27:1: warning: "NULL" redefined

In file included from /usr/include/_G_config.h:14,

                 from /usr/include/libio.h:32,

                 from /usr/include/stdio.h:72,

                 from ./OSINIT/v86func.c:11:

/usr/lib/gcc/i386-redhat-linux/4.1.0/include/stddef.h:403:1: warning: this is the location of the previous definition

gcc -c -O2 -I ./INCLUDE ./OSINIT/asm/*.c

./BIN/fasm ./OSINIT/asm/c032.asm ./c032.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

3 passes, 124511 bytes.

./BIN/fasm ./OSINIT/asm/timer.asm ./timer.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

1 passes, 440 bytes.

./BIN/fasm ./OSINIT/asm/keyboard.asm ./keyboard.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

1 passes, 358 bytes.

./BIN/fasm ./OSINIT/asm/handles.asm ./handles.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

3 passes, 12319 bytes.

./BIN/fasm ./OSINIT/asm/setirqs.asm ./setirqs.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

1 passes, 352 bytes.

./BIN/fasm ./OSINIT/asm/v86subrs.asm ./v86subrs.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

2 passes, 563 bytes.

./BIN/fasm ./OSINIT/asm/fpemu.asm ./fpemu.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

3 passes, 1484 bytes.

gcc -c -O2 -I ./INCLUDE -I ./Kern44/INCLUDE -std=c99 ./Kern44/*.c

gcc -c -O2 -I ./INCLUDE -I ./Kern44/INCLUDE ./Kern44/asm/*.c

gcc -c -O2 -I ./INCLUDE -std=c99 ./LIB/*.c

gcc -c -O2 -I ./INCLUDE -std=c99 ./TOOLS/*.c

./BIN/fasm ./TOOLS/sysout.asm ./sysout.o

flat assembler  version 1.67.6  (16384 kilobytes memory)

2 passes, 939 bytes.

gcc -c -O2 -I ./INCLUDE ./VERSION/*.c

./VERSION/OSROM.c:87: warning: initialization from incompatible pointer type

ar cr libos.a *.o

gcc -c -O2 -I ./INCLUDE tasks.c -L./ -los

In file included from tasks.c:16:

./INCLUDE/compiler.h:27:1: warning: "NULL" redefined

In file included from /usr/include/string.h:33,

                 from tasks.c:13:

/usr/lib/gcc/i386-redhat-linux/4.1.0/include/stddef.h:403:1: warning: this is the location of the previous definition

gcc: -los: linker input file unused because linking not done

rm -f *.o


Script done on Пнд 24 Июл 2006 14:14:09

Сейчас еще дам другой вариант

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

>gcc -c -O2 -I ./INCLUDE tasks.c -L./ -los

а маны кто будет читать??

>gcc: -los: linker input file unused because linking not done

ну тебе же сказали чистым англицким сказали что никто не будет ничего линковать ибо незатребовано.

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

с чего ты взял что незатребовано. Там как раз все очень затребовано но gcc этого непонимает.

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

> с чего ты взял что незатребовано.

:/ gcc так сказал - мы ему больше верим. А не затребовано, потому что указан флаг -c, при котором линковка не делается.

tailgunner ★★★★★ ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

предлагаю попробовать следующее:

ld --verbose -Map OS.map -oOS.elf --script ld.conf *.o *.o

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

Поправил все тоже самое :( Я пробовал уже даже с *.o *.o *.o

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

т.е. он прибавляет теже ругательства только еще к бибилотеке.

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

ты уверен что указал ВСЕ обьектники и либы?

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

в смысле я уверен что тебе тербуется прилинковать нечто кроме *.o

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

Так ты уверен, что у тебя нет пересеченя по именам?

tailgunner ★★★★★ ()
Ответ на: Re: GCC undefined reference от tailgunner

Re: GCC undefined reference

100% не по именам файлов не по именам функций. Функции тоже 100% есть.

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

есть такая команда nm

запость ка сюда её вывод для каждого твоего обьектника

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

Запости вывод make на какое-нибудь нормальное место, типа pastebin.com. У#щный webfile.ru не отдает файло.

tailgunner ★★★★★ ()
Ответ на: Re: GCC undefined reference от tailgunner

Re: GCC undefined reference

$ nm sysout.o
         U _SysComObjOffset
0000009f T _SysGetDsSel
000000a5 T _SysGetEsSel
000000ab T _SysGetFsSel
000000b1 T _SysGetGsSel
000000b7 T _SysGetTssSel
00000043 T _SysLookSeg
000000be T _SysLookTss
00000000 T _SysOutLine
00000120 T _SysReadDWord

NoName ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

>есть такая команда nm

>запость ка сюда её вывод для каждого твоего обьектника

Или вывеси tar.bz2 со всеми объектниками (если он < 1М)

tailgunner ★★★★★ ()
Ответ на: Re: GCC undefined reference от tailgunner

Re: GCC undefined reference

смысл? Итак видно что есть функции на которые ругается вроде SysOutLine

NoName ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

А он может оказаться меньше, чем объем данных, которыми мы обменяемся, выясняя всё это через форум :) Может и не оказаться, конечно.

Попробуй линковать, указывая не *.o, а список имен файлов. Попробуй их упорядочить. Если количесвто ошибок уменьшится, ты на верном пути. Почитай man насчет опции "-(".

tailgunner ★★★★★ ()
Ответ на: Re: GCC undefined reference от NoName

Re: GCC undefined reference

>смысл? Итак видно что есть функции на которые ругается вроде SysOutLine

ну и где видно что у тебя есть ф-я 'SysOutLine'?

повнимательней посмотри.

посмотрел? ещё раз посмотри.

нету её у тебя посему и ругаемся

cvv ★★★★★ ()
Ответ на: Re: GCC undefined reference от cvv

Re: GCC undefined reference

я сейчас тоже сам догадался что это очень веселая штука разные ОС разные программы и идеология :) Подчеркивание в асме для borland c :)

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