Kompilace na Linuxu pro Windows

krz

Kompilace na Linuxu pro Windows
« kdy: 26. 05. 2018, 11:13:41 »
Zdravím všechny, potřeboval bych poradit s Crosskompilací.

Pokouším se vytvořit jednoduchý program pro windows, ale nevím, jak ze souborů typu libstdc++.dll.a vytvořit klasické dll. Víte někdo?


uuuuuuuu

Re:Kompilace na Linuxu pro Windows
« Odpověď #1 kdy: 26. 05. 2018, 11:21:42 »
S mingw to pry jde, nezkousel jsem.

krz

Re:Kompilace na Linuxu pro Windows
« Odpověď #2 kdy: 26. 05. 2018, 11:38:17 »
S mingw to pry jde, nezkousel jsem.

Já právě ano, ale bohužel netuším, jak to má vlastně fungovat. Ani se mi nepodařilo zjistit, co je za formát ta knihovna s příponou .a . Klasický .so soubor to není a nemám přesně tucha, k čemu přesně je, byť je jasné, že jde o objektový soubor nebo něco podobného.

.

Re:Kompilace na Linuxu pro Windows
« Odpověď #3 kdy: 26. 05. 2018, 14:56:39 »
.a je statická knihovna, která bude po linkování součástí kódu hlavního programu. Na rozdíl od toho .so je sdílená dynamická knihovna, která se přilinkuje, ale nestane se součástí hlavního programu a na systému ji musí mít nainstalovanou, pokud chcete spouštět hlavní program.

Nevím, v jakém jazyce to píšete (asi c++), ale tu knihovnu musíte přidat v linkovací fázi. Předpokládám, že emuluje nějakou základní c++ knihovnu na windows.

Na linuxu je osvědčená cesta mingw, tady je podrobný manuál:
http://forums.codeblocks.org/index.php?topic=3343.0

krz

Re:Kompilace na Linuxu pro Windows
« Odpověď #4 kdy: 26. 05. 2018, 17:21:18 »
.a je statická knihovna, která bude po linkování součástí kódu hlavního programu. Na rozdíl od toho .so je sdílená dynamická knihovna, která se přilinkuje, ale nestane se součástí hlavního programu a na systému ji musí mít nainstalovanou, pokud chcete spouštět hlavní program.

Nevím, v jakém jazyce to píšete (asi c++), ale tu knihovnu musíte přidat v linkovací fázi. Předpokládám, že emuluje nějakou základní c++ knihovnu na windows.

Na linuxu je osvědčená cesta mingw, tady je podrobný manuál:
http://forums.codeblocks.org/index.php?topic=3343.0

Díky za podrobné vysvětlení.

S Mingw bohužel teprve začínám, takže se teprve učím. Snad mi už bude všechno jasné a nějak se tím prokoušu.


Re:Kompilace na Linuxu pro Windows
« Odpověď #5 kdy: 26. 05. 2018, 17:37:29 »
Zkuste nejdřív hello world s použitím vlastní hello world knihovny - přeložit si jednotlivé fáze na linuxu ručně, zkusit knihovnu slinkovat staticky, dynamicky, výsledek nainstalovat, spustit statickou i dynamickou verzi, podívat se, na jakých dynamických knihovnách spustitelná binárka závisí. Až to budete mít tohle prošlapené na linuxu, zkuste to samé pro windows třeba s mingw nebo cygwin, možná dnes další možnosti, nemám tušení. Záleží, jestli jen ten prográmek „linuxový“ a chcete ho jen spustit na windows anebo zda v linuxu vyvíjíte prográmek, který závisí na nějakém windows api nebo na windows knihovně. Takže ideálně by to chtělo vidět ten program nebo alespoň adekvátní příklad (pokud dokážete zhodnotit, co je v daném případě adekvátní).

Omlouvám se obecnou odpověď, ale nechce se mi vymýšlet konkrétní příklady když nevím, zda se trefím do vaší situace. Hlavní poselství příspěvku je, že nemůžete moc rozumět crosscompilaci, když nemáte v ruce normální kompilaci. Jděte na to postupně, je ti IMHO docela zábavné.
« Poslední změna: 26. 05. 2018, 17:39:36 od Ondrej Nemecek »

MD

Re:Kompilace na Linuxu pro Windows
« Odpověď #6 kdy: 26. 05. 2018, 19:51:45 »
Pokud je vaším cílem vyvíjet pro Windows a netrápit se moc s věcmi kolem cross kompilace, nejrychlejší cestou by bylo hodit si do virtuálky Windows a Visual Studio. Pokud to má být WIndows-only aplikace, stejně ji budete na tom systému muset testovat, případně ladit.

krz

Re:Kompilace na Linuxu pro Windows
« Odpověď #7 kdy: 27. 05. 2018, 10:18:59 »
Zkuste nejdřív hello world s použitím vlastní hello world knihovny - přeložit si jednotlivé fáze na linuxu ručně, zkusit knihovnu slinkovat staticky, dynamicky, výsledek nainstalovat, spustit statickou i dynamickou verzi, podívat se, na jakých dynamických knihovnách spustitelná binárka závisí. Až to budete mít tohle prošlapené na linuxu, zkuste to samé pro windows třeba s mingw nebo cygwin, možná dnes další možnosti, nemám tušení. Záleží, jestli jen ten prográmek „linuxový“ a chcete ho jen spustit na windows anebo zda v linuxu vyvíjíte prográmek, který závisí na nějakém windows api nebo na windows knihovně. Takže ideálně by to chtělo vidět ten program nebo alespoň adekvátní příklad (pokud dokážete zhodnotit, co je v daném případě adekvátní).

Omlouvám se obecnou odpověď, ale nechce se mi vymýšlet konkrétní příklady když nevím, zda se trefím do vaší situace. Hlavní poselství příspěvku je, že nemůžete moc rozumět crosscompilaci, když nemáte v ruce normální kompilaci. Jděte na to postupně, je ti IMHO docela zábavné.

Díky všem za reakce.

Bohužel musím přiznat, že jsem po tom všem docela zmaten. Snažil jsem se postupovat při vytváření dll podle jednoho začátečnického tutoriálu na adrese http://gernotklingler.com/blog/creating-using-shared-libraries-different-compilers-different-operating-systems/ . Statická kompilace mi funguje bez problému. Ale při vytváření dll mi je Wine nenajde, ani když jsou ve stejném adresáři.

Moje situace je velice jednoduchá. Vytvářím nějaký prográmek v Qt, primárně mě zajímá Linux. Ale chtěl jsem jej ukázat jednomu člověku, co má Windows. Naivně jsem si říkal, že by to mělo být snadné. Na internetu jsem si našel něco o MXE a zkusil jej zkompilovat. To se bohužel nezdařilo, viz.  https://forum.root.cz/index.php?topic=18574.msg266443#msg266443 . Tak jsem si říkal, že tu Cross kompilaci zkusím rozběhnout i bez toho. Zkusil jsem nějakou jednoduchou úpravu Makefile, která ale byla ve výsledku neúspěšná. Pak jsem si zkusil vytvořit nějaké základní knihovny pro nějaký svůj Hello world podle Vašeho doporučení. Bohužel ve výsledku vše vždy skončí tak, že Wine nenajde příslušné soubory a já nic nespustím.

Takže nejsem schopný rozběhnout ani jednoduchý Hello world a kompilace prográmku pro Qt je v nedohlednu. Každopádně jsem si to rád zkusil. Kdybyste někdo věděli, v čem bych tak mohl dělat chybu, budu rád.

krz

Re:Kompilace na Linuxu pro Windows
« Odpověď #8 kdy: 27. 05. 2018, 10:40:21 »
Update - Hello world se mi už podařilo rozchodit, chyba na mojí straně, neměl jsem nakopírovány všechny dll v kořenovém adresáři, bylo tam jen to, které jsem vytvořil sám. Zmátlo mě, když Wine hlásilo vždy, že chybí všechny.

Teď už jenom nevím, jak zkompilovat to Qt, ale snad to časem zvládnu s tím, co jsem se právě naučil. Jen nevím, kdy se k tomu dostanu, protože čas nezastavíš...

MD

Re:Kompilace na Linuxu pro Windows
« Odpověď #9 kdy: 27. 05. 2018, 13:46:14 »
Citace
Teď už jenom nevím, jak zkompilovat to Qt, ale snad to časem zvládnu s tím, co jsem se právě naučil. Jen nevím, kdy se k tomu dostanu, protože čas nezastavíš..

Qt na svém webu dovoluje stáhnout již zkompilované binárky (pro Windows), takže pokud vám stačí dynamické linkování, možná by se dalo využít jich.

Satecek s marmeladou

Re:Kompilace na Linuxu pro Windows
« Odpověď #10 kdy: 27. 05. 2018, 17:53:04 »
Připravit korektně cross-compiler pro Windows i s QT není jednoduché. Pokud si opravdu chcete ušetřit čas a starosti, tak programy v QT pro Windows kompilujte buď v MSYS2 (má balíky pro QT v dynamické i statické verzi a dalších mnoho knihoven, a na Windows potom nemá žádné závislosti), nebo QT zkompilovat ve VS20xx a cpát s programem VS runtime.

Já osobně jsem po různých cross pokusech zůstal právě u MSYS2. Stáhnout se to dá na http://www.msys2.org/.