Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

C linker neke nejasnoce

[es] :: C/C++ programiranje :: C linker neke nejasnoce

[ Pregleda: 2407 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Whitewater
dummy workshop

Član broj: 339178
Poruke: 397



+137 Profil

icon C linker neke nejasnoce07.11.2018. u 08:17 - pre 65 meseci
pogledao sam nekoliko knjiga i videa ali ipak mi nesto nije jasno.

npr kad se objasnjavaju komande poput #define i #include kaze da preprocesor jednostavno obrise ,konstante iz #define sameni za prave vrednosti i onda biblioteke iz #include ukljuci cele u kod i onda ga kompajlira pretvori u asembler i onda iz asemblera u masinski kod.

I tek onda dolazi linker ?!

ne razumem koje to bibloteke linkuje kad mi u main() programu ili fajlu smo vec ukljucili ono sto nam treba itoje vec preprocessor prosledio kompajleru ?
I saw a USO last night.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
82.117.201.26



+1064 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 08:25 - pre 65 meseci
Ne mora da pretvori u asembler, ali mora da linkuje, sa obzirom da imas c runtime biblioteku i libc standardnu biblioteku.
Inkluduju se samo header-i, ne i implentacioni fajlovi. Mislim, moze, ali od vajkada su ljudi provalili da se prave biblioteke,
umesto da se kod kompajlira svaki put ;)
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 397



+137 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 08:31 - pre 65 meseci
hm, ali on meni ovako kaze ako ja kazem u main programu

Code:
#include<stdio.h>


onda preprocesor ceo text tog fajla iskopira u moj main pre kompjaliranja. Dakle ceo fajl.

Meni je tu bilo cudnojer onda ispada da se stalno iiznova kompajlira stdio.h ?!
I saw a USO last night.
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 397



+137 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 08:34 - pre 65 meseci
o da sad kapiram.

ti kazes: on inkluduje samo header od stdio.h npr, a ostatakkoda linkuje ? D/N
I saw a USO last night.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
82.117.201.26



+1064 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 08:38 - pre 65 meseci
Pa da. U headeru ne ide implementacija.
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 397



+137 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 08:43 - pre 65 meseci
tu se samo deklarisu funkcije tako ? A u kom fajlu je onda implementacija stdio.h

pokusavam da nadjem na internetu kako igleda kod stdio.h jel moes da mi poslajes link, malo sam zbunjen
I saw a USO last night.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 08:44 - pre 65 meseci
Kada c kompajler iskompajlira tvoj kod, napravi .o fajl.
U njemo se nalazi, recimo, mašinski kod tvojih funkcija, kao i TABELA SIMBOLA (nazivi eksternih funkcija).
Da bi od takvog koda napravio izvršni kod, potrebno je da pronađe te funkcije u listi biblioteka koju si mu dao kroz opcije za linkovanje. Implementacija tih funkcija se nalazi ili u .so fajlovima (na Linuxu, na Win je to .dll), ili u .a fajlovima (arhive .o fajlova).
Neke biblioteke na moraju da se eksplicitno navode (na primer libc.so koja je standardna c biblioteka, ili libsocket.so), doke neke obavezno moraju da se navode.
Recimo, ako koristiš lex, onda u opciji kompajliranja moraš da staviš -llex da bi linker našao gde su implementirane funkcije koje pozivaš iz svog programa.

Na Linuxu se stdio.h (obično) nalazi na /usr/include/stdio.h a biblioteka se obično nalazi na /usr/lib/libc.so
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 397



+137 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 09:00 - pre 65 meseci
Citat:
djoka_l: Kada c kompajler iskompajlira tvoj kod, napravi .o fajl.
U njemo se nalazi, recimo, mašinski kod tvojih funkcija, kao i TABELA SIMBOLA (nazivi eksternih funkcija).
Da bi od takvog koda napravio izvršni kod, potrebno je da pronađe te funkcije u listi biblioteka koju si mu dao kroz opcije za linkovanje. Implementacija tih funkcija se nalazi ili u .so fajlovima (na Linuxu, na Win je to .dll), ili u .a fajlovima (arhive .o fajlova).
Neke biblioteke na moraju da se eksplicitno navode (na primer libc.so koja je standardna c biblioteka, ili libsocket.so), doke neke obavezno moraju da se navode.
Recimo, ako koristiš lex, onda u opciji kompajliranja moraš da staviš -llex da bi linker našao gde su implementirane funkcije koje pozivaš iz svog programa.

Na Linuxu se stdio.h (obično) nalazi na /usr/include/stdio.h a biblioteka se obično nalazi na /usr/lib/libc.so


e to to, bravo.

sad mi se sjasnilo ?

jer gde je nastala zabuna kod mene. Ja sam umislio da je stdio.h komplet kod, zanmarujuci da ono h stoji zapravo za HEADER.

sad kako sam razumeo: ubacivanje HEADERA od strane pp sluzi samo da kompajler napravi TABELU SIMBOLA koju ce polse linker da iskoristi da isproziva jednu po jednu funkciju koja vec ttreba

D/N
I saw a USO last night.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
82.117.201.26



+1064 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 09:20 - pre 65 meseci
Ne.
Header sluzi tome da uzmes prototipe funkcija kako bi prilikom poziva f-je dobijao gresku u kompajliranju ako pogresis parametre.
Tu naravno idu i definicije struktura ili deklaracije globalnih varijabli.
Tabela simbola se pravi prilikom proizvodnje object fajla i sadrzi sve definisinane globalne f-je i varijable u datom modulu.

edit: znaci kada pozivas f-ju referenca na simbol se ubelezi u objektni fajl, pa onda linker potrazi simbol i kad ga nadje simbol zameni sa adresom.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 09:21 - pre 65 meseci
Evo reda iz stdio.h
Code:
extern int printf (__const char *__restrict __format, ...);


Dakle heder kaže, postoji neka EKSTERNA funkcija printf koja ima takve i takve argumente. Dakle, da bi se napravio izvršni kod od tvoje funkcije, linker zna da treba da ulinkuje neku biblioteku koja sadrži implementaciju funkcije printf.
Po defaultu, hederi se nalaze u /usr/include, a ako imaš još neke nestandardne hedere onda -I<folder> kaže kompajleru da traži dodatne hedere u tom katalogu.
Slično, biblioteke se nalaze u /usr/lib, a ako treba da traži biblioteke na drugim mestima, staviš -L<folder>. Ovo samo kaže u kom folderu da traži biblioteke. Dodatno, biblioteku uključuješ u kod sa -l<ime biblioteke>

Neki kompajleri i okruženja ne moraju da uključe čak ni heder u tvoj sors jer drže već iskompajlirane verzije hedera na nekom mestu.

Isto tako radiš i kada pišeš neke svoje biblioteke. Napraviš .h sa PROTOTIPOVIMA tvojih funkcija, pa onda neke druge programe linkuješ sa svojim bibliotekama.
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 397



+137 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 17:18 - pre 65 meseci
da sad mi je puno jasnije. Zanimljivo da u ovoj odlicnoj knizi C primer od Prata ne mogu da nadjem primere za implementaciju nekih svojih biblioteka. Ne znam zasto to nije za Primer nivo ? Nasao sam ovde.

To create a Library of code you need to do the following:

(1) Create an INTERFACE to your library: mylib.h.
(2) Create an IMPLEMENTATION of your library: mylib.c.
(3) Create a LIBRARY OBJECT FILE that can be linked with programs that want to use our library code.

sa https://www.cs.swarthmore.edu/...nixhelp/howto_C_libraries.html

sad vezano za ovo da pitam usput i http://c-faq.com/struct/sd1.html

da li je poenta kod opaque da implementacija ostane izolovana ili skrivena od korisnika. Tj koliko sam razumeo ako ja pravim neku biblioteku (tj ako ma sta da jos nije napravljeno) ja korisnicima i samom sebi dostavljam header file u textualnom obliku .h gde oni vide format funkcija ili strukture podataka koju koristim, a implementacioni fajl im ne dajem u text obliku .c vec samo vec iskompajliran .obj ?






I saw a USO last night.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 18:23 - pre 65 meseci
Pretpostavljam da u životu nisi napisao program duži od 1000 linija. Mada, realnija je pretpostavka da ti je najduži program bio kraći od 300 linija.
Sada zamisli da radiš na projektu koji ima 10000 c modula, svaki od po 300 linija. Ako promeniš jednu liniju u jednom c fajlu, dali ćeš da kompajliraš 3 miliona linija c koda ili samo taj fajl od 300 linija?

To je osnovni razlog zašto deliš veliki program na kraće module. Dalje, neki kod možeš iznova da koristiš u različitim projektima bez potrebe da ga svaki put ponovo kompajliraš.
Tek negde, treće po redu, je potreba da sakriješ svoju implementaciju. Ali dok dođeš do toga da nekom prodaješ svoje biblioteke, ima leba da se najedeš.
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 397



+137 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 19:38 - pre 65 meseci
nisi mi bas odgovorio na zadnje pitanje osim sto si me ukorio jer nemam iskustva.
I saw a USO last night.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 20:25 - pre 65 meseci
Napisao sam ti TRI razloga zašto čuvaš .o fajl a ne kompajliraš svaki put ponovo, vrati sa na post pa ponovo pročitaj.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.adsl-surfen.hetnet.nl.



+7169 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 20:33 - pre 65 meseci
Citat:
Whitewater
Tj koliko sam razumeo ako ja pravim neku biblioteku (tj ako ma sta da jos nije napravljeno) ja korisnicima i samom sebi dostavljam header file u textualnom obliku .h gde oni vide format funkcija ili strukture podataka koju koristim, a implementacioni fajl im ne dajem u text obliku .c vec samo vec iskompajliran .obj


U tom slucaju bi vrlo verovatno korisnicima davao ili .a / .lib fajlove (mnostvo .o / .obj fajlova upakovanih u jednu staticku biblioteku) ili, verovatnije, dinamicke biblioteke (.so / .dll).

Ali to je potpuno sekundarna stvar u odnosu na glavni razlog razdvajanja interfejsa od implementacije, kao sto su ti ljudi vec napisali. Primarna stvar je ta da ne zelis da kompajler mora da kompajlira sve ostale source fajlove zato sto si ti promenio nesto u implementaciji neke funkcije. Ako nisi menjao interfejs, sa razdvojenom implementacijom u .c/.cpp fajlu kompajler nece morati da rekompajlira ostale fajlove koji koriste tu funkciju.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 397



+137 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 22:00 - pre 65 meseci
pa da.

razumem ja da se poslovi koji se cesto obavljaju izdvajaju u funkcije unutar main ili ako ce trebati za buducnost cesce onda moze i u posebne biblioteke pa ih poziva i sluze mi u razlicitim programima. To bese valda top down dev.

takodje razumeo sam i da ne treba svaki put reompajlirati biblioteke kad menjam main pa ga rekompailiram i slicno ako recimo poboljsam neku biblioteku, novi algoritam ili bolje resenje ne moram rekompajlirati i main vec ce to linker da spoji.

Zato sam se i zabunio jer mi je lose bilo objasnjeno da SVAKI put kad kazem \include on tj pp mi c/p ceo tekst fajla jer sam ja mislio da .h sadrzi celu implementaciju. I zato sam se pitao pa cekaj sta onda radi linker ako kompajler uvej jovo nanovo sve iskompajlira.

dakle kako sam sada razumeo>

include sluzi samo da kompajleru kaze koju biblioteku ce trebati kasnije linker da poveze sa main D/N

I saw a USO last night.
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 397



+137 Profil

icon Re: C linker neke nejasnoce07.11.2018. u 22:03 - pre 65 meseci
pardon, ako sam menjao biblioteku moracu ponovo rekompajlirati i main da linker to lepo spoji.

ali ako menjam main ne moram rekompajlirati i biblioteke koje nisu menjane.
I saw a USO last night.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16683
*.speed.planet.nl.



+7169 Profil

icon Re: C linker neke nejasnoce08.11.2018. u 08:16 - pre 65 meseci
Tako je, ako ne menjas implementacioni kod koji je vec kompajliran u .lib/.obj fajlovima, linker ce samo koristiti predhodno kompajlirane fajlove bez potrebe da se kompajliraju ponovo.

To je bukvalno kriticno za ogromne projekte sa hiljadama fajlova, zamisli da moras za svaki build sve da kompajliras :-)
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Whitewater
dummy workshop

Član broj: 339178
Poruke: 397



+137 Profil

icon Re: C linker neke nejasnoce09.11.2018. u 03:43 - pre 65 meseci
moj skromni prilog koji objasnjava sta sam pitao steta sto nisam odmah naleteo na ovo> ako nekom jos zatreba...



I saw a USO last night.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C linker neke nejasnoce

[ Pregleda: 2407 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.