Názory ke článku Oracle C++ Call Interface – 2. First contact, hups connect.
29. 8. 2007
Ahoj,
fajn článek (i když asi né pro masy lidí). Docela dost mi pomohl. Ale nevyřešil mojí základní otázku: Jak skompilovat OCCI aplikaci pomocí MinGW? Mam pořád problém s knihovnami. Přesněji linker hlásí:
undefined reference to `oracle::occi::Environment::createEnvironment(oracle::occi::Environment::Mode, void*, void* (*)(void*, unsigned int), void* (*)(void*, void*, unsigned int), void (*)(void*, void*))'
Víš jak na to?
Pro ostatní čtenáře - ve Visual Studiu v nastavení linkeru záleží na pořadí v jakém jsou knihovny uvedeny (oraocci10.lib oci.lib ociw32.lib). Docela mě to vypeklo tak to uvádím pro ostatní.
No celkovo s tymi libkami to je dost o drzku. Priznam sa ze OCCI pod MinGW som neskusal a myslim ze to tak ruzove nebude z dovodu nedostupnosti libiek. Co sa tyka portability OCI ani OCCI si v tomto velmi dobre nevedu. POd Linuxom som nemal najmensi problem vsetko zlinkovat skompilovat a vsetko frcalo na prvy sup. Co sa tyka Win32 tak tam som sa uz dobre natrapil aj ja a chcelo to dost googlit :-/ Lenze to sa jednalo o VIsual Studio. Co sa tyka Dev-cpp a podobnych, fakt neviem ci to vobec je mozne. Inac na nete (asi z tohto dovodu) je mnozstvo OCI a OCCI portovatelnych wrapperov. Mozno by v tomto pripade bolo lebsie siahnut po tychto wrapperoch ktore su uz naportovane na kadeco.
2. 9. 2007
Hrál jsem si s tím jeden celý den a závěr je takový, že to prakticky nejde. MinGW kompilátor (v. 3.4) nedokáže přilinkovat .lib knihovny pro MS Visual Studio, podporuje jen .a. Použití knihoven pro Linux také není možné protože je třeba spousta .so dynamických knihoven (nevím jestli z nich nějak lze udělat statické). Tak jsem zkusil toto:
1. Z oci.lib, ociw32.lib, oraocci10.lib jsem vyextrahoval definice (.def):
echo EXPORTS > %1.def
nm %1.lib | sed -n "/00000000 T/s/\([^_]*_\)//p" >> %1.def
kde %1 je název knihovny bez přípony (je k tomu nutné mít binutils (nm) z MinGW a sed portovaný na win)
2. Pomocí dlltool (součást binutils) zkusil konverzi:
dlltool -D %1.dll -d %1.def -l %1.a
to proběhlo OK pro oci.lib, ociw32.lib. S oraocci10.lib byl problém - chyba .def souboru. Tak jsem zkoušel .def získat pomocí objdump z oraocci10.dll a toto dll-ko poté zkonvertovat do statické .a. Narazil jsem na stejný problém tak jsem ještě zkusil pexports, ale ten skončí při exportu .def neodchycenou vyjímkou. Tak jsem nakonec šáhnul po MS Visual Studiu 2005 Express a použil jeho utilitku dumpbin v kombinaci se sedem:
echo EXPORTS > %1.def
dumpbin /exports %1.dll | sed -nf exp_flt.sed >> %1.def
, kde exp_flt.sed obsahuje:
/[ ]*ordinal hint/,/^[ ]*Summary/{
/^[ ]\+[0123456789]\+/{
s/^[ ]\+[0123456789]\+[ \t]\+[0123456789ABCDEFabcdef]\+[ ]\+[0123456789ABCDEFabcdef]\+[ ]\+\(.*\)/\1/p
}
}
to už zabralo a získal jsem definice .def ... použil jsem dlltool a získal z oraocci10.dll statickou liboraocci10.a.
Ale i když tyto tři (.a) knihovny přilinkuju tak mi g++ hlásí nenalezené reference na Enviroment. Ruční slinkování jsem zkoušel také, ale to je na Win peklo - místo tří nenalezených referencí získám celou obrazovku :-))
Aktuálně používám na Win wxDev-C++ s tím, že jsem si nainstaloval MS C++ kompilátor (aktuálně s MS Visual Studiem 2005 Express - takže bych mohl klidně používat i toto IDE, ale nevím jak je to licenčně - pro zkoušení to stačí, ale pokud budu chtít vytvořené produkty dále šířit pod GPL tak nevím ...)
A do budoucna zkusím ještě toto:
1) MinGW obsahující gcc 2.95 (doporučeno z fora na OTN, ale pod Linux)
2) Vyzískat liboraocci10.a z oraocci10.lib a né z oraocci10.dll ... resp. doufám, že pomocí něčeho Microsoftího získám definice .def z .lib tak, že je schroupne dlltool.
3) Víc si hrát se SEDem při fitrování definic z .lib a .dll.