Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno nenajdena referencia v dynamickej kniznici

Zdravim.

Nevie mi niekto povedat preco pri kompilaci aplikacie s vlastnou kniznicou mi nevie najst referenciu na funkciu, ktora v danej kniznici je?
Na miesto toho vrati chybovu hlasku:

/tmp/ccBKzsAv.o: In function `main':
test.c:(.text+0xa): undefined reference to `test'
collect2: ld returned 1 exit status

Nieco robim zle ale vobec neviem co.
Zdrojak v ktorom funkciu volam vyzera takto:

 #ifdef __cplusplus
 extern "C"
 #endif
 char test ();

 int main ()
 {
   return (int)test ();
 }
 

ak bude treba prilozim aj zdrojak kniznice.

Předmět Autor Datum
ked to chces linkovat dohromady tak to nemoze byt dynamicka kniznica ale musi to byt staticka knizni…
MM.. 20.09.2011 17:03
MM..
Ak pouzivas gcc tak http://www.delorie.com/djgpp/doc/ug/compiling/gcc. html The -l options are used…
MM.. 20.09.2011 17:12
MM..
Zdravim. Trosku neskoro ale skor sa mi nedalo, no uz mi to ide. Pouzil som zly prekladac. Kniznica b…
PeterKD 22.09.2011 09:40
PeterKD
Daj si do google slova "calling convention"
MM.. 22.09.2011 14:36
MM..
Alebo si daj do google slova "mix C and C++", alebo citaj napr. http://msdn.microsoft.com/en-US/libr…
MM.. 22.09.2011 14:45
MM..
Vdaka za pomoc. Vyzera ze je to, presne to co som potreboval odtial sa uz dalej odrazim, len som nev… poslední
PeterKD 26.09.2011 09:25
PeterKD

ked to chces linkovat dohromady tak to nemoze byt dynamicka kniznica ale musi to byt staticka kniznica (.lib). A to konkretne lib musis pridat v tvojom vyvojovom prostredi do nastaveni linkera, pre dany projekt. Uvidis tam uz plno .lib a pridas tam nakoniec aj to svoje.

Ked chces pouzivat dynamicke kniznice (.dll) tak to sa robi uplne inac, neda sa to volat priamo ale najprv LoadLibrary a potom volat cez pointre. Prikladov je milion, napr. na MSDN
P.S. jaj ty to asi chces pre linux, tak tam dll asi nie su :) Ale plati to co som pisal v prvom odstavci. Bud das tu kniznicu uz skompilovanu (lib) linkeru, alebo je aj moznost pridat si do projektu normalne vsetky zdrojaky kniznice.

Ak pouzivas gcc tak
http://www.delorie.com/djgpp/doc/ug/compiling/gcc. html

The -l options are used to add libraries to your program. Note that order is important! You should always list libraries after all your objects. If you don't, gcc might not realize that it needs them until it's too late. The -l option is a shortcut for linking a library, because you can always just list the library on the command line (like "gcc hello.o mylib.a"). The benefit of the -l option is that you don't need to know where the library is. This is used for the standard libraries, and in fact, gcc will automatically add -lc to whatever you type in order to get the standard C library (libc.a). Note that with the -l option, you only need to specify part of the library name. gcc assumes that the library name starts with "lib" and ends in ".a", so -lfoo would refer to libfoo.a and would be found wherever the standard libraries are kept.

ak je ta kniznica v nedefaultnom adresari tak potrebujes nastavit aj cesty na kniznice
http://www.network-theory.co.uk/docs/gccintro/gcci ntro_21.html

When additional libraries are installed in other directories it is necessary to extend the search paths, in order for the libraries to be found. The compiler options -I and -L add new directories to the beginning of the include path and library search path respectively.

Zdravim.
Trosku neskoro ale skor sa mi nedalo, no uz mi to ide. Pouzil som zly prekladac. Kniznica bola zostavena cez g++ a aplikaciu, kde som chcel kniznicu pouzit som kompiloval cez cc a ten akceptoval iba volania, ktore boli deklarovane s klauzulou extern "C" a ja v kniznici mam umiestnenu aj triedu nie len funkcie.

Nahodou nevies co znamena extern "C" a jeho vyuzitie, alebo knihu kde sa o tom dozviem viac? Zatial som sa to nepotreboval.

Alebo si daj do google slova "mix C and C++", alebo citaj napr. http://msdn.microsoft.com/en-US/library/0603949d%2 8v=VS.80%29.aspx, alebo si najdi calling convention pre C++ a C (a trebars aj pascal, ptz napr. cele WinAPI ma pascal calling convention a neni to jedno).
Rozdiel je v tom co prekladac musi urobit pred a po volani funkcie, neni to jedno. Z toho dovodu pri linkovani je rozlisovana konvencia, a funkciu s nespravnou konvenciou to vobec nenajde (pri linkovani nazov funkcie obsahuje aj dalsie potrebne informacie, takze linker nehlada len "test" ale vpodtste nieco ako "_test0IUGZFW" apod. prekladace si tam davaju aj potrebne informacie o tom jak je nutne tu fciu volat, ptz keby si volal tu fciu inac alebo s inym mnozstvom parametrov, tak by ti ten program na tom mieste dokonale skapal. Preto musis zadat aj tvojmu kompileru programu v programe spravnu konvenciu, s akou bola kompilovana kniznica.

Zpět do poradny Odpovědět na původní otázku Nahoru