C , multiple definitions

Programovacie jazyky, rady, poradňa...
elessar
Expert
Expert
Príspevky: 174
Registrovaný: 22 aug 2005, 16:41

C , multiple definitions

Príspevok od používateľa elessar »

//vyriesene

Zdravim,
mohol by mi niekto vysvetlit, v com spociva problem, pri ktorom mi prekladac vypisuje

Kód: Vybrať všetko

(.text+0x0): multiple definition of `_start'
/usr/local/lib/gcc/i686-linux/4.3.5/../../../../i686-linux/lib/crt1.o:(.text+0x0): first defined here
main:(.rodata+0x0): multiple definition of `_fp_hw'
/usr/local/lib/gcc/i686-linux/4.3.5/../../../../i686-linux/lib/crt1.o:(.rodata+0x0): first defined here
main: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/local/lib/gcc/i686-linux/4.3.5/../../../../i686-linux/lib/crti.o:(.fini+0x0): first defined here
main:(.rodata+0x4): multiple definition of `_IO_stdin_used'
/usr/local/lib/gcc/i686-linux/4.3.5/../../../../i686-linux/lib/crt1.o:(.rodata.cst4+0x0): first defined here
main: In function `__data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/local/lib/gcc/i686-linux/4.3.5/../../../../i686-linux/lib/crt1.o:(.data+0x0): first defined here
main: In function `__data_start':
(.data+0x4): multiple definition of `__dso_handle'
/usr/local/lib/gcc/i686-linux/4.3.5/crtbegin.o:(.data+0x0): first defined here
main: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/local/lib/gcc/i686-linux/4.3.5/../../../../i686-linux/lib/crti.o:(.init+0x0): first defined here
/tmp/ccyteHvV.o: In function `napoveda':
main.c:(.text+0x0): multiple definition of `napoveda'
main:(.text+0xd4): first defined here
/tmp/ccyteHvV.o: In function `decomp':
main.c:(.text+0x14): multiple definition of `decomp'
main:(.text+0xe8): first defined here
/tmp/ccyteHvV.o: In function `main':
main.c:(.text+0x187): multiple definition of `main'
main:(.text+0x25b): first defined here
/usr/local/lib/gcc/i686-linux/4.3.5/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__'
main:(.dtors+0x4): first defined here
/usr/local/bin/ld: warning: Cannot create .eh_frame_hdr section, --eh-frame-hdr ignored.
/usr/local/bin/ld: error in main(.eh_frame); no .eh_frame_hdr table will be created.
collect2: ld returned 1 exit status
1)problem s multiple definitions pri funkciach dekomp a napoveda som vyriesil pamatovou triedou static
2)pri kompilacii bez parametrov (gcc -o main main.c) je program skompilovany bez problemov, avsak s "-std=c99 -Wall -Wextra -pedantic" mi vypise horeuvedene problemy
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: C , multiple definitions

Príspevok od používateľa chrono »

Bez toho, aby si napísal presne aké parametre sa použijú pri kompilovaní a linkovaní ti nikto neporadí (pretože podľa toho výpisu to vyzerá tak, ako keby si tam tie objekty mal viac krát).
elessar
Expert
Expert
Príspevky: 174
Registrovaný: 22 aug 2005, 16:41

Re: C , multiple definitions

Príspevok od používateľa elessar »

hm, tak teraz som sa trocha pohral s parametrami prekladaca:
pri pouziti

Kód: Vybrať všetko

gcc -std=c99 -Wall -pendatic -g program.c -o program 
to uz skompilovalo bez problemov, ale ked dam prec prepinac "-o", tak to vypise hore uvedene chyby

co robi ten zazracny prepinac -o ? docital som sa, ze "Tento parametr zapíná generování optimalizovaného kódu. Na funkčnost programů to nemá žádný vliv, ale můžou se pak dříve projevit některé chyby, jako například použit neinicializovaných proměnných. Na druhou stranu se programy přeložené s tímto přepínačem hůře ladí v debuggerech, takže záleží na vás, jestli jej při vývoji použijete nebo ne", ale z toho mi nie je zrovna jasne, preco to uz s nim funguje
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Re: C , multiple definitions

Príspevok od používateľa chrono »

Pomocou parametru -o určuješ, do akého súboru sa má uložiť skompilovaný súbor. Ak to tam nedáš, a teda použiješ gcc program.c program, tak to pre kompilátor znamená: skompiluj súbor program.c a k výsledku prilinkuj súbor program a ulož to do a.out (a keďže v tom súbore program sú už tie symboly, tak to potom píše tie chyby, pretože rovnaké symboly sú aj v program.c a v crt.o).

PS: Optimalizácia sa nastavuje pomocou parametru -O (a teda veľké písmeno o).
Napísať odpoveď