Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 5. říjen 2011, 20:09:08 Předmět: MinGW :: MSVC :: Linker :: DLL |
|
|
Zdravím.
S Pokym jsme teď narazili na delikátní problém a nějak z toho nejsme moudří. Já si vytvořil DLL knihovnu (dejme tomu libKnihovna.dll) s jednou funkcí (používám MinGW). Všechno v pohodě, když jsem jí chtěl použít ve svém projektu, tak jsem bez váhání do linkeru napsal název knihovny (bez lib na začátku > -lKnihovna) a jak jsem očekával, vše fungovalo...co jsem ale neočekával, že k tomu nebude třeba libKnihovna.a ... jenže...chtěli jsme to samé napodobit u Microsoft Visual Studia (MSVC), jenže tam bez knihovna.lib neudělám vůbec nic.
Po několika experimentech jsme se dotali k tomu, že když Poky udělal rovněž knihovnu, tak jsem jí zase nemohl použít já v MinGW (undefined reference)...
Jsme z toho zmatení. Pokud víte o nějakém postupu, jak vytvořit "přenositelnou" dll knihovnu mezi MinGW a MSVC, docela bychom byli rádi...
Popř. by nám někdo mohl vysvětlit, jak je to vůbec s těma DLL.
Díky. _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 5. říjen 2011, 20:22:54 Předmět: |
|
|
http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs
toto som inak raz riesil konkretne skompilovanie ffmpeg do MSVC. kedze ffmpeg je skompilovatelny len s gcc/mingw tak som to kompiloval s nim. dostal som teda *.dll *.a *.def subory. zobral som dll subory a potom som z tych def pomocou nejakeho toolu obsiahnuteho v MSVC vygeneroval *.lib pre MSVC. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 5. říjen 2011, 20:45:13 Předmět: |
|
|
Já tedy předpokládám, že Internal Builder v Eclipsu si dokáže tyhle symboly vytáhnout z dll stejně jako bych to dělal přes ten Tvůj postup. Jiné vystvětlení pro správnou funkci (v MinGW - Eclipse) bez *.a nemám.
To by ale znamenalo, že MinGW dll jsou jiné než MSVC dll...
Potvrďte/vyvraťte mi to... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 5. říjen 2011, 21:51:37 Předmět: |
|
|
Já můžu dát jen obecný popis. DLL soubor je pořád stejný. Nejsou v něm přesné signatury funkcí. Funkce v DLL se dají volat podle čísla nebo i jména a nepotřebujete k tomu naprosto žádný další soubor. Problém je, že samotné DLL je čistě binární soubor a nedefinuje, jaký model volání a jaké parametry mají ty funkce v něm. Už jen jazyk C a C++ mají jiný model volání i na stejném překladači, takže bez nějaké té doplňkové informace by to prostě nemohlo jít. Proto třeba to MSVC používá ty LIB soubory. Otázkou je, proč to Microsoft neudělal tak, aby všechny informace (čili všechna metadata chybějící přímo v DLL) byly přímo v H souboru. Nebo proč nikdy nevznikla nějaká noěvjší verze DLL standardu, kde by byla už kompletní metadata. To netuším.
Pomocí utilitky Dependency Walker můžete prohlížet, jaká metadata jsou uložena přímo v DLL. Vše ostatní si pak překladač a linker potřebují doplnit odjinud. Jde o součást některých verzí Visual Studia, také ke stažení na webu Microsoftu. _________________ Děcka, mám doktorát z informatiky a aplikované matematiky, tak se se mnou laskavě nehádejte.
(Každej tu má nějakej zaručeně tvrďáckej podpis, tak já teď taky. ) |
|
Návrat nahoru |
|
|
Yossarian
Založen: 28. 07. 2007 Příspěvky: 274 Bydliště: Šalingrad
|
Zaslal: 6. říjen 2011, 14:07:27 Předmět: |
|
|
Al napsal: |
Už jen jazyk C a C++ mají jiný model volání i na stejném překladači |
Coze? (a vubec, celej ten tvuj prispevek je uplny blabol) |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 6. říjen 2011, 16:24:28 Předmět: |
|
|
Tiez cumim... Ale mozno to bude tym, ze som len inzinier. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. říjen 2011, 19:58:46 Předmět: |
|
|
nou napsal: |
http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs
toto som inak raz riesil konkretne skompilovanie ffmpeg do MSVC. kedze ffmpeg je skompilovatelny len s gcc/mingw tak som to kompiloval s nim. dostal som teda *.dll *.a *.def subory. zobral som dll subory a potom som z tych def pomocou nejakeho toolu obsiahnuteho v MSVC vygeneroval *.lib pre MSVC. |
Ať se snažím sebevíc, tak visuálku se ten podstrčený lib, vyrobený pomocí toho návodu, nelíbí... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 6. říjen 2011, 20:58:37 Předmět: |
|
|
asi mi to uniklo, ale proc neni mozne zkompilovat zdrojovy kod te knihovny pod kazdym kompilatorem zvlast? |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. říjen 2011, 21:01:31 Předmět: |
|
|
quas4 napsal: |
asi mi to uniklo, ale proc neni mozne zkompilovat zdrojovy kod te knihovny pod kazdym kompilatorem zvlast? |
Tak možné to samozřejmě je, ale my bychom chtěli tu knihovnu napsat jednou (resp. kompilovat jí jen na jednom z PC) a mít možnost jí používat jak v MSVC (Poky), tak i v MinGW (já).
Pokud se mi to ale vyřešit nepovede, tak asi uděláme dvě verze...jednu pro MSVC, druhou pro MinGW no a já bych si rád udělal ještě třetí pro Linux.
_________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Weny Sky
Založen: 28. 07. 2007 Příspěvky: 241
|
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 6. říjen 2011, 21:35:57 Předmět: |
|
|
Dík, ale já to potřebuji obráceně...z MinGW dll do MSVC...
EDIT: Se*u na to. Si to každý bude kompilovat holt sám... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 6. říjen 2011, 22:46:28 Předmět: |
|
|
a ten sposob ze z def subory vygenerovat lib? to si neskusal hladat? _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 7. říjen 2011, 02:16:04 Předmět: |
|
|
pcmaster napsal: |
Tiez cumim... Ale mozno to bude tym, ze som len inzinier. |
Jo, ničím jiným to ani nemůže být.
Jen tak mimochodem, dávat metadata o linkování do .h souboru je kravina roku. Asi mi nezbude nic jinýho, než dát Alovi titul "středoškolský doktor".
A teď ještě vážněji. DLL oficiálně neobsahuje informace pro linker jakéhokoliv IDE. (VC++ třeba potřebuje .lib) Jenomže, u DLL se dá projít seznam názvů exportovaných funkcí (pokud tam ty názvy jsou, nejsou povinné myslím). MinGW toho mohlo využít, protože tak to přece funguje na POSIX platformách, které umí dynamické linkování. Na takových stačí jen binárka knihovny a můžeš si to linkovat k programům během kompilace jak je libo. (ono se to ve skutečnosti nelinkuje, jenom se tam dá informace o tom, jaká knihovna se má linkovat za běhu a linker pak akorát drží hubu). MinGW tady tohle mohlo napodobit. Jelikož na Windows žádné defaultní systémové vývojové prostředí (tj. aspoň command-line compiler a debugger) není, je v tom trochu bordel, ale to je na Windows ve všem.
Jinak C++ linkování je stejné jak C, akorát názvy funkcí mají v sobě zakódovány názvy typů, namespacy apod. (kvůli přetěžování funkcí, aby to nekolidovalo, jiný důvod to asi fakt nemá), proto ty názvy vypadají dost hrozně, ale dají se dekóvat zpět do C++. Přes nějaký prohlížeč DLL souboru by sis teoreticky mohl vyextrahovat i třídy s metodama, akorát ti nebude sedět sizeof(velikost třídy), což by ale nevadilo, pokud tu třídu alokuje ta knihovna sama. Tabulka virtuálních funkcí je vyexportována zvlášť jako static proměnná ve třídě, takže to by zlobit nemělo. (pokud si to dobře pamatuju) _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 7. říjen 2011, 06:38:32 Předmět: |
|
|
najdi v VS lib.exe a skus toto. lib.exe /def:nazov_def_suboru.exe
no ako C++ ma tie mena kvoly pretazovaniu a virtualnycm funkciam. a este kazdy prekladac to ma inak. niekedy sa to dokonca meni aj s verziami prekladaca. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 7. říjen 2011, 07:33:31 Předmět: |
|
|
Zkoušel jsem extrahovat názvy z MinGW knihovny jak pomocí dumpbin.exe, tak pexport.exe (command prompt), pak jsem použil lib.exe pro vytvoření LIB. Jenže linker visuálka chtěl úplně jiné názvy (symboly), než se exportovaly z původní knihovny. Včera jsem si s tím hrál asi 4 hodiny a vyzkoušel jsem snad všechny možnosti. Dokonce jsem si kvůli tomu dumpnul i některé knihovny (opengl32.dll spolu s opengl32.lib abych porovnal názvy), ale zprovoznit se mi to stejně nepovedlo...
Microsoft Deep Magic... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
|