.[ ČeskéHry.cz ].
MinGW :: MSVC :: Linker :: DLL
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
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ň

PříspěvekZaslal: 5. říjen 2011, 20:09:08    Předmět: MinGW :: MSVC :: Linker :: DLL Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 5. říjen 2011, 20:22:54    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 5. říjen 2011, 20:45:13    Předmět: Odpovědět s citátem

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... Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Al



Založen: 23. 10. 2007
Příspěvky: 196

PříspěvekZaslal: 5. říjen 2011, 21:51:37    Předmět: Odpovědět s citátem

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. Very Happy)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Yossarian



Založen: 28. 07. 2007
Příspěvky: 274
Bydliště: Šalingrad

PříspěvekZaslal: 6. říjen 2011, 14:07:27    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1824

PříspěvekZaslal: 6. říjen 2011, 16:24:28    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 6. říjen 2011, 19:58:46    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 6. říjen 2011, 20:58:37    Předmět: Odpovědět s citátem

asi mi to uniklo, ale proc neni mozne zkompilovat zdrojovy kod te knihovny pod kazdym kompilatorem zvlast?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 6. říjen 2011, 21:01:31    Předmět: Odpovědět s citátem

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.
Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 6. říjen 2011, 21:13:13    Předmět: Odpovědět s citátem

http://jrfonseca.planetaclix.pt/projects/gnu-win32/software/reimp/index.html
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 6. říjen 2011, 21:35:57    Předmět: Odpovědět s citátem

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... Laughing
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 6. říjen 2011, 22:46:28    Předmět: Odpovědět s citátem

a ten sposob ze z def subory vygenerovat lib? to si neskusal hladat?
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 7. říjen 2011, 02:16:04    Předmět: Odpovědět s citátem

pcmaster napsal:
Tiez cumim... Ale mozno to bude tym, ze som len inzinier.

Jo, ničím jiným to ani nemůže být. Very Happy

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". Smile

A teď ještě vážněji. Cool 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. Wink

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1047

PříspěvekZaslal: 7. říjen 2011, 06:38:32    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 7. říjen 2011, 07:33:31    Předmět: Odpovědět s citátem

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... Rolling Eyes
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna