» »

[C++ & Linux & G++ prevljalnik]Kako dodati knjižnico?

[C++ & Linux & G++ prevljalnik]Kako dodati knjižnico?

balocom ::

eee, mam en problem v linux okolju z g++ prevajalnikom. Pri prevajnju mi vrže vn napako:

marko.cpp:13: error: ‘ow_init’ was not declared in this scope

To napako mi vrže vn ne glede na to da pokažem z -l na .h, na .a ali pa na .so datoteko (pa tudi ob headerja sm dal poleg standardnih knjižnic), pravtako so tudi datoteke, ki so v lib mapi dane zraven drugih knjižnic.
V svetu brez googla bi bil najbolj uporabljen ukaz v bash-u ukaz man

MasterMind ::

kaj pa -L in -l ? (drugi -l je mali L).
Gentoo, KDE uporabnik.

balocom ::

-l je bil mišljen kot mali L...
.h in .so so v /usr mapi (v include pa v lib podmapi), ker, ko nardim include na .h ne javi da ne najde include fajla, ko pa hočem uporabiti funkcijo iz tega .h pa javi da tega ne najde:\

Any idea???
V svetu brez googla bi bil najbolj uporabljen ukaz v bash-u ukaz man

fiction ::

> To napako mi vrže vn ne glede na to da pokažem z -l na .h, na .a ali pa na .so datoteko
> (pa tudi ob headerja sm dal poleg standardnih knjižnic),
> pravtako so tudi datoteke, ki so v lib mapi dane zraven drugih knjižnic.

A pa si siguren da ves kaj delas? -lsomething pomeni, da se bo pri linkanju programa uporabila knjiznica
libsomething.so (oz. libsomething.a ce das -static). In sicer iz /lib oz. /usr/lib. Z -L nastavis lahko dodatno pot iskanja.
Header file ima naceloma notri samo definicijo funkcije (ne pa tudi implementacije) tako da nima veze tudi ce manjka
(in prava opcija za to je -I).
Vazno je samo, da se pri povezovanju prevedenih delov ta funkcija nekje najde.

Sicer nisem siguren kaj ow_init() sploh dela, ampak kolikor gledam na http://www.owfs.org,
izgleda kot da je OW pisano z veliko - torej OW_init().

balocom ::

Pri OW_initi vrže vn:
marko.cpp:(.text+0xb6): undefined reference to `OW_init'
collect2: ld returned 1 exit status

Če pa pot prestavim v mapo iz kjer sem include skopiral, pa mi enostavno izpiše da ne more najti includa (v mislih imam .so fajl) (pa tuk kot root sm probal če bo slučajno kaj razlike).

(ja vem kaj delam, pač hočm en svoj program napisat pa uporablam ene hedaerje in knjižnice ki ne pridejo standardno zraven prevajalnika).
V svetu brez googla bi bil najbolj uporabljen ukaz v bash-u ukaz man

fiction ::

Ja, samo include != .so file.
.so file je shared object - deljena knjiznica, ki vsebuje definicijo neke funkcije in sicer je tukaj notri
ze prevedena koda.
Header file oz. tisto kar includas je pa tekstno in vsebuje samo nekaj v stilu:
void function();
Torej .so datoteke nic ne includas!

error: ‘ow_init’ was not declared in this scope
Ok, to ocitno pomeni, da ne najde deklaracije (v C-ju ponavadi dela tudi brez predhodne deklaracije - kar sicer ni lepo
ampak ok, C++ pa ocitno tega ne dovoli).

marko.cpp:(.text+0xb6): undefined reference to `OW_init'
Ta error mi zgleda bolje - dejansko se je zadeva prevedla (kar pomeni da je ocitno
stvar nasla deklaracijo za OW_init() v neki .h datoteki), samo na koncu linker ni
mogel vsega spakirati skupaj ker ni bilo nikjer definicije za OW_init().
Probaj -L/pot/do/neke/so.datoteke -lime
pri cemer je /pot/do/neke/so.datoteke/libime.so tista datoteka.

balocom ::

še vedno isto, ne glede na to kter include sprobam ne glede na njegovo končnico...
V svetu brez googla bi bil najbolj uporabljen ukaz v bash-u ukaz man

BigWhale ::

g++ -I/pot/do/include/datotek -o MyExecutableName -L/pot/do/dodatnih/knjiznjic -llibFoo lala.c

Takole nekako...


Parametri pa so:

-I za compiler, dodatni include direktorij
-L za linker, direktorij kjer naj isce obstojece knjiznjice
-l za linker, ime knjiznice, ki naj jo linka (brez .so koncnice)

fiction ::

> -l za linker, ime knjiznice, ki naj jo linka (brez .so koncnice)

In kolikor vem tudi brez "lib" prefiksa v imenu.
Ce das se -static (poleg -lime) bo zadeva uporabila libime.a (kar je v bistvu
ar arhiv normalno prevedenih objektnih datotek - .o), za
.so morajo biti prevedene s -fPIC.

balocom ::

g++ marko.cpp -I/opt/owfs/include -L/opt/obfs/lib/ /opt/owfs/lib/libowcapi.so -O3 -s -o program
prevedeno:D 0:)
Ej, thx za tole.
V svetu brez googla bi bil najbolj uporabljen ukaz v bash-u ukaz man


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Code:Blocks, c++] Program ne najde knjižnice

Oddelek: Programiranje
111297 (1076) gtu
»

Qt Designer -> KDevelop C++ Error

Oddelek: Programiranje
352059 (1589) 'FireSTORM'
»

[C] MySQL

Oddelek: Programiranje
292732 (1754) Tutankhamun
»

[C++] Kateri C++ IDE je najbolj osnoven?

Oddelek: Programiranje
212219 (1664) sid_dabster
»

c++ vstavljanje knjižnice v kodo

Oddelek: Programiranje
161554 (1213) SasoS

Več podobnih tem