c++ closed source *.so + *.h virtual

Fórumok

Sziasztok!

Kovetkezo a kerdes: adott egy zart forrasu konyvtar (libWhatever.so), es hozza egy TyWhatever.h nevu header, amiben vannak effele deklaraciok:


namespace dzs
 {   class TyWhatever
      {   public:
              virtual int Valami(int ize) = 0;
              virtual int Bigyo(int akarmi) = 0;
      };
 }

Nomost, a libWhatever.so-ban vannak szimolumok, konkretan ilyesmik hogy dzs::CsWhatever::Valami(int) meg dzs::CsWhatever::Bigyo(int). Szoval ebbol az kovetkezik hogy a CsWhatever peldanyara van valojaban szuksegem, amik implementaljak a TyWhatever osztaly virtualis metodusait. Ez igy teljesen jol hangzik elsore. Annyira nem vagyok napi szintu kapcsolatban a c++ virtual-jainak a viselt dolgaival, de az onmagaban nyilvan keves ha valami ilyesmi kiterjesztest beadok meg kezzel az include "TyWhatever.h" utan, hogy


namespace dzs
{
 class CsWhatever: public TyWhatever { };
}

Valami ilyesmit hianyol a gomberzekem hogy `extern dzs::CsWhatever ...;`, de igy hirtelen nem latom, hogy. A dolog szepsege ugye hogy a *.h fileokban semmi utalas nincs a dzs::CsWhatever:: szimbolumokra.

Barmi otlet amivel lehet(ne) workaroundot csinalni erre?

thx, A.

Hozzászólások

A dokumentációban nincs példa arra, hogy hogyan kéne használnod?

Egy hete konyorgok doksiert (ami tulmutat jelenleg egy, a fenti *.h-bol doxygen-nel generalt baszon tul). Meg valami MWE-ert. De semmi :)

Mondjuk a logikus workaround (*.h-ban search & replace TyWhatever => CsWhatever, illetve a pure virtual elotagok/utotagok kihuzasa) termeszetesen mukodik itten, szepen lefordul a dolog. De valoszinuleg a kolto nem erre gondolt...

Ahhoz, hogy használj egy osztályt elegendő az interfészét ismerned, az van a headerben. Kellene lenni egy másik belépési pontnak is, amivel egy ilyen ojjektumot (CsWhatever) példányosítani lehet. Végignézted az összes exportált szimbólumot?

Ha ez egy csak neked készített és csak általad használt cucc, akkor lehet szar is, lehet hogy meg kell hekkelni. Ha mások is használják, akkor valószínű, hogy van helyes út is.

C++-ban nagyjabol ez a modja annak, hogy szetvalasszuk az interfeszt es az implementaciot. Az elmeleti hatter annyi erosen zanzasitva, hogy nagyjabol a virtualis metodus tabla az, ami forditok kozott hordozhato modon van implementalva.

Tehat csinalnak egy absztrakt osztalyt (TyWhatever), ez az interfesz, es az implementacio fogja a konkret megvalositast tartalmazni. Ez neked azert lehet jo, mertha uj verzio jon a library-bol, csak az interfesz valtozasa eseten (tehat a pure virtual osztaly valtozasa eseten) kell csak ujraforditani a kododat.

A kerdes gyakorlati reszehez visszaterve: ilyenkor altalaban van valamilyen standalone factory fuggveny, ami TyWhatever* visszateresi ertekkel rendelkezik es vagy a "new TyWhatever(...)" hivas eredmenyevel ter vissza, vagy a lib tartalmaz egy statikus TyWhatever peldanyt, aminek visszaadja a cimet. Ezt mondjuk jo lenne tudni, hogy melyik az igaz, mert az elso esetben felelsz az elettartamert a masodik esetben nem...

Szoval az kellene kideriteni legeslegelso lepesben, hogy mi ez a factory fuggveny es ki felelos a visszaadott ojjektum felszabaditasaert.

altalaban van valamilyen standalone factory fuggveny, ami TyWhatever* visszateresi ertekkel rendelkezik
No, ezaz, hogy ilyesmit se nagyon talaltam :/ Mindenesetre mar jeleztem a gyartonak hogy itten valami nem kerek. Ugy adta at a *.h fileokat hogy "lehet hogy nem mindegyikre lesz szukseged", amiben siman benne van az is hogy "lehet hogy valamit elfelejtettem odamasolni" :]

Namostan engem le fognak hurrogni, de az igazság az, hogy a C++ nem kompatibilis. Más nyelvekkel sem, de egyik gyártó C++-ja a másik gyártó C++-jával sem. Úgyszintén nem kompatibilis a dinamikus betöltéssel. Szóval akkor járnál jól, ha egy pure (helyesebben: püré) C-nyelvi interfészt kapnál a derék gyártótól.

Jogos, de nalunk talan most nem jatszik - legalabbis ugyanugy bubuntu 18.04-en forditottak le a *.so-kat, mint amilyen azon a gepen van amin hasznalni akarjuk. Mondjuk igen, ha en majd rendesen/elesben nem bubuntun hanem igazi debianon akarom hasznalni, akkor lehet hogy majd szivok.

De kozben kiderult, valoban nem azokat a *.h-kat adta oda a té gyarto mint amiket kellett volna :/ Most mar megy. Marmint lefordul es nem segfaultol. Ugyhogy lassan jon majd a valodi munka is!