Pravljenje dijeljenih biblioteka (.so fajlova)

Trebam da napravim dijeljenu biblioteku .so od 5 .cpp fajlova koji imaju svoje .h fajlove. Opet tih pet fajlova koriste svoje dvije biblioteke, jednu .a i jednu .so. Dakle moja pitanja su slijedeca:

  • Trebam li napraviti jos jedan .cpp (i eventualno .h fajl) u kojem cu navesti (eksportovati) funkcije koje cu da koristim iz biblioteke i kako se to eksportovanje radi. Da li treba navesti nesto kao EXPORT na mjestu gdje je definisana fja?

  • Onda kad (ako) se sve to eksportuje u taj 6. .cpp fajl da li treba prilikom pravljenja biblioteke komandom g++ -shared… navesti samo njega ili i ove ostale .cpp fajlove? Odnosno da li se biblioteka pravi samo od njega jer smo u njemu naveli funkcije koje cemo korisiti ili od svih .cpp fajlova?

Hvala

Evo opet: http://tldp.org/HOWTO/Program-Library-HOWTO

Da vidimo šta kaže 3 poglavlje:

[quote]3.4. Creating a Shared Library

Creating a shared library is easy. First, create the object files that will go into the shared library using the gcc -fPIC or -fpic flag. The -fPIC and -fpic options enable ``position independent code’’ generation, a requirement for shared libraries; see below for the differences. You pass the soname using the -Wl gcc option. The -Wl option passes options along to the linker (in this case the -soname linker option) - the commas after -Wl are not a typo, and you must not include unescaped whitespace in the option. Then create the shared library using this format:

gcc -shared -Wl,-soname,your_soname \ -o library_name file_list library_list
[/quote]
Dokument je relativno kratak i dosta razumljiv, te pokriva svako tvoje dosadašnje pitanje za g++ linkanje, i na ovom i drugim threadovima.

Još treba razumjeti da se “komajliranje” C/C++ programa odvija u 2 faze:

  1. kompajliranje u objektni kod (*.o datoteke)
  2. linkanje statičkih (.a) i dinamičkih (.so biblioteka)

header datoteke ti trebaju za prvi korak (može 5, ili se može sve strpat u jednu)
Svaka* funkcija koja nije bila definisana kao “static” vidjet će se u shared biblioteci. Mislim da se jedino kod Microsoft-ovih kompajlera moraju nekakve export liste (*.lib datoteke?) pravit i slične gluposti.

  • Za “skrivanje” non static funkcija i neka druga fina podešavanja, moguće je koristiti GCC function attributes.

Vidi, kume. Razumio sam ja sve sto si ti napisao, i ovdje i meni u mailu. I napravio sam biblioteku i ovaj neki testni program koji je otvara i u kojem pozivam funkcije iz nje. Neke krace funkcije cija je definicija u .h fajlu rade ok, medutim funkcije cija je definicija u .cpp nisam mogao pozvati jer linker prijavi gresku. Taj sam problem rijesio kad sam stavio da je funkcija virtuelna. E sad, da li to znaci slijedece: da bi izbildao .so fajl svaku funkciju koju zelim pozivati moram proglasiti virtuelnom ili postoji nacin da u nekom posebnom fajlu nabrojim te funkcije? Razlog ove moje zabune je sto sam dobio kod napisan u VC++ 2005 (za dll) koji sam trebao prevesti pod linux. Visual studio sam napravi neki main.cpp fajl u kojem eksportuje funkcije pa sam mislio da je tako nesto i u linuxu.

A kad staviš funkcije (metode?) da su virtuelne onda se program skrši prilikom pokretanja (ako ga uopšte uspiješ pokrenut), što znači da to samo maskira compile time problem…

Probaj napravit redukciju problema na najmanji broj datoteka i koda, te postaj kod/datoteke i komande kojima buildaš…