Autor Wątek: Kompilowanie binarek dla Windows na Linuxie  (Przeczytany 7481 razy)

Offline gamecreator

  • Użytkownik
    • Game C++reator - strona o tworzeniu gier w C++

# Maj 03, 2006, 03:07:11
Siema.

Co trzeba poczarować żeby GCC mógł kompilować kod źródłowy korzystający z Win32 API i wygenerował binarki dla Windows? Gdzieł czytałem, że LD potrafi tworzyć binarki Windowsowe [EXE PE] gdy się mu dowali odpowiednie opcje. Pozostaje też kwestia includów i libów statycznych Win32 SDK - jak to cholerstwo dodać do GCC i skąd wziąć odpowiedni pakiet dla GCC?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline DarkJarek

  • Użytkownik
    • DarkJarek HomePage

# Maj 03, 2006, 08:20:20
Cytuj
skąd wziąć odpowiedni pakiet
Z tym chyba niema problemu: instalujesz PSDK na windzie i kopiujesz sobie na linuxa proste :D

Offline empitness

  • Użytkownik
    • portfolio

# Maj 03, 2006, 11:20:39
Sam jestem mocno zainteresowany tym tematem, ponieważ do tej pory, aby skompilować na Windowsa aplikację napisaną w SDLu, musiałem kopiować wszystkie źródła na windowsową partycję, przechodzić na Windowsa i dopiero kompilować ją za pomocą DevCpp. Na pewno nie tak wyobrażałem sobie _pełną_ cross-platformowość, dlatego kiedyś zainteresowałem się artykułem jj. Nie bardzo jednak chciało mi się dla skompilowania prostej gierki ściągać i instalować najnowsze wersje gcc, itp., dlatego tymczasowo pozostałem przy starym rozwiązaniu.

Znalazłem jednak artykuł, który zachacza o te kwestie przenośności kodu: http://www.linuxjournal.com/article/7128
Nie mam na razie czasu przeczytać go w całości i wypróbować podane tam rozwiązania, ale szczególnie interesujący wydał mi się fragment "Cross-compiling". Pomimo tego, że nie ma tam podanych jakiś wyczerpujących informacji, to jednak pewne podstawy są opisane, poza tym zawsze można zarzucić hasłem "cross-compiling" na google i może znaleźć coś bardziej wyczerpującego.

agent_J

  • Gość
# Maj 03, 2006, 12:17:45
Cytuj
skąd wziąć odpowiedni pakiet
Z tym chyba niema problemu: instalujesz PSDK na windzie i kopiujesz sobie na linuxa proste :D
I lamiesz prawo bo to nielegalne ...

agent_J

  • Gość
# Maj 03, 2006, 12:28:28
I lamiesz prawo bo to nielegalne ...

Jakoś cygwin posiada headery windowsowe. Chyba za pomocą wine można przekompilować program używający WinAPI.

agent_J

  • Gość
# Maj 03, 2006, 12:34:47
Bardzo prosto: trzeba zainstalować sobie kompilator skrośny (crosscompiler). Dla gcc to będzie mingw32. Większość dystrybucji ma odpowiednie pakiety, np. w PLD są to crossmingw32-*, w Gentoo xmingw-*, w Ubuntu (Debian?) universe/devel/mingw32*. Dokładniejsze instrukcje można znaleźć np w [1] [2]. Jeśli w dystrybucji której używacie nie ma odpowiedniego pakietu to:
a) zmieńcie dystrybucje :)
b) skompilujcie ręcznie - [3].

Aha, nagłówki WinAPI z MinGW nie są od MS - [4].

st3tc: nie prawo tylko licencje. Na licencje należy jeszcze spojrzeć pod kątem zgodności z prawem. W szczególności czy nie zachodzi tu ,,dozwolony użytek''. Co nie zmienia faktu, że łamanie umowy (nawet sprzecznej z prawem) ma zawsze w sobie element braku przyzwoitości.

[1] Poradnik rodem z ReactOS
[2] Blog Beniamina Blocka
[3] FAQ MinGW - kompilacja skrośna
[4] MinGW - licencja nagłówków WinAPI
« Ostatnia zmiana: Maj 03, 2006, 12:39:42 wysłana przez bies »

Offline gamecreator

  • Użytkownik
    • Game C++reator - strona o tworzeniu gier w C++

# Maj 04, 2006, 07:35:10
Dzięki wszystkim za odpowiedzi i linki. Poczytałem sobie wszystko i conieco się wyjaśniło, jednak zrodziło też kilka kolejnych pytań, więc znów poproszę was o wyjaśnienia  ;)

1. Oba systemy [Windows i Linux] działają na tej samej architekturze procesora [x86]. GCC pod linuxem kompiluje mi kod binarny dla x86. Czy na pewno potrzebuję cross-compiler, jeśli obie binarki są kompilowane dla tej samej architektury procesora? Według tych tekstów potrzebuję zainstalować kompilator MinGW. Dlaczego muszę to robić, mając już kompilator GCC? Myślałem że mogę w jakiś sposób go użyć.

2. Myślałem że MinGW to jedynie port GCC dla Windows. Jak to więc w końcu jest?

3. Tak sobie myślę, że kompilator GCC który już mam, powinien być w stanie kompilować kod używający WinAPI jeśli tylko ma odpowiednie nagłówki. Mam nagłówki Win32 API z MinGW na partycji Windowsowej, które zainstalowały się tam wraz z Code::Blocksem dla Windows. Czy mogę ich w takim razie jakoś użyć z GCC?

4. Do tej pory wydawało mi się, że wszystko rozbija się tutaj raczej o linker, który składa te fragmenty binarne do kupy i dodaje nagłówki właściwego formatu pliku wykonywalnego [np. ELF, a.out czy EXE PE]. W manualach linkera LD znalazłem opcje -m i --oformat, które ponoć odpowiadają za format tworzonego pliku wykonywalnego. W takim razie może wystarczyłoby coś pokombinować z tymi opcjami, żeby LD zrobił EXEka w formacie EXE PE? Chyba że jest jeszcze coś, o czym nie wiem?

5. Instrukcja instalacji cross-compilera MinGW wygląda mniej więcej tak, że:
 - Najpierw instaluje się binutils
 - Później kompiluje się gcc ze źródeł by otrzymać kompilator C
 - Później instaluje się pakiet w32api z nagłówkami i libami dla Windows
 - Potrzebna jest jeszcze prekompilowana biblioteka runtime mingw32 [libmingw32.a + mingw32.dll jak sądzę]
 - Na koniec jeszcze raz kompiluje się gcc ze źródeł, by otrzymać kompilator C++
Wygląda więc na to, że nie muszę kompilować GCC ze źródeł, bo już go mam na Linuxie. Jedyne co jest mi potrzebne, to podpiąć jakoś te liby w32api i linkować runtime mingw32 z binarkami dla Windows, dając przy tym właściwe opcje dla LD by otrzymać binarkę w formacje EXE PE. Dobrze myślę?

Cytat: st3tc
I lamiesz prawo bo to nielegalne ...

Nie, jeśli nie używam oryginalnych nagłówków od Microsoftu, tylko np. tych "robionych" z MinGW ;)

Cytat: Agent_J
Chyba za pomocą wine można przekompilować program używający WinAPI.

To, o czym mówisz, to WineLib. Polega to na skompilowaniu kodu źródłowego programu windowsowego tak, by używał biblioteki Wine [WineLib] zamiast windowsowych. Dzięki temu programu nie trzeba uruchamiać pod Wine, lecz bezpośrednio w systemie Linux, bo tworzona jest normalna aplikacja Linuxowa korzystająca z Linuxowych API ;)
Mnie jednak chodzi o to, by na Linuxie skompilować binarkę, którą będzie można odpalać na Windowsach.
« Ostatnia zmiana: Maj 04, 2006, 07:41:28 wysłana przez gamecreator »

Offline DarkJarek

  • Użytkownik
    • DarkJarek HomePage

# Maj 04, 2006, 07:58:57
Cytuj
skąd wziąć odpowiedni pakiet
Z tym chyba niema problemu: instalujesz PSDK na windzie i kopiujesz sobie na linuxa proste :D
I lamiesz prawo bo to nielegalne ...
A dlaczego? Przecież PSDK jest za darmo i ogólnie dostępne.

agent_J

  • Gość
# Maj 04, 2006, 08:50:37
A dlaczego? Przecież PSDK jest za darmo i ogólnie dostępne.
A czy czasem w licencji PSDK nie jest napisane, ze moze byc uzywane wylacznie na OS-ach MS-a ? (pytam bo nie sprawdzalem - ale znajac MS-a na 99% tak).

st3tc: nie prawo tylko licencje.
bies - nie bardzo rozumiem czemu mialo sluzyc to stwierdzenie. Sugerujesz, ze zlamanie licencji na oprogramowanie nie oznacza zlamania prawa. Nie moge teraz znalesc na dysku pdf-a z ustawa o prawach autorskich i prawach pokrewnych (a na szukanie po necie nie mam czasu), ale o ile pamietam sprawy licencji byly tam precyzyjnie opisane. I rowniez z tego co pamietam (ta sama ustawa), lamanie licencji jest niezgodne z prawem. Ja pisalem w kontekscie rozszerzonym - juz biorac pod uwage obowiazujace w PL prawo. (ofkoz moge sie mylic - dawno nie zagladalem do tej ustawki ;>)
« Ostatnia zmiana: Maj 04, 2006, 09:02:53 wysłana przez st3tc »

agent_J

  • Gość
# Maj 04, 2006, 13:45:16
Gamecreator ad 2. Mingw32 to port kompilatora gcc mogący budować binarki dla Windows32 (nacisk na 32). Nie jest określone gdzie sam kompilator hasa - może być i Solaris.

Ad 1, 3, 4, 5. IMO nie, w zależności od target podanego do configure buduje Ci się trochę inny kompilator (np. różne wsparcie dla wątków, spróbuj pod linuksowym gcc użyć -mthreads). Oczywiście, pewnie różni się niewiele. Jeśli zatem chcesz to próbuj albo szukaj kogoś kto próbował (ja się z takim przypadkiem nie spotkałem). Moim zdaniem najłatwiej będzie skompilować wszystko od nowa (tj. jeśli rzeczywiście chcesz kompilować - naprawdę nie masz tego w distro?).

Aha, jeszcze jedno. Instrukcja którą podałeś pozwoli pod Linuksem zbudować mingw-gcc działające na Windows (ostatni punkt Twojej instrukcji). Tobie nie jest to potrzebne, z tą różnicą, że kompilujesz od razu kompilator C, C++, Javy itp w pkt. 2.

Dokładniej to wygląda tak:
1) Kompilujesz binutils jak w [1].
2) Instalujesz skompilowane binutils w jakimś swoim katalogu (np. /home/ja/mingw).
3) Dodajesz powyższy katalog do $path.
4) Kompilujesz gcc (wybierasz wszystkie języki jakie Cię interesują) jak w [2].
5) Instalujesz go jak w pkt. 2.
6) Kompilujesz i instalujesz mingw-runtime i mingw-winapi ([3], [4])
7) Powinieneś mieć dostępne polecenia i386-mingw32-g++ i podobne - to już wszystko, działa.

Jeśli zechcesz znowu (w innym terminalu, sesji) użyć mingw32 pamiętaj aby dodać katalog do $path.

Jeśli nie bardzo rozumiesz instrukcje w [1], [2], [3], [4] to polecam zapoznać się z [5].


st3tc: dokładnie tak, złamanie licencji niekoniecznie musi oznaczać złamania prawa. Weźmy np. kategoryczny zakaz RE w licencjach. Tymczasem polskie prawo jasno określa warunki na jakich można dokonywać RE. Podobnie jest z możliwością zrobienia kopii zapasowej. Dlatego każdą licencję trzeba prześwietlić pod kątem zgodności z prawem.

St3tc, ja nie wiem, czy użycie nagłówków PSDK poza Windows będzie zgodne z polskim prawem. Po prostu zaznaczam, że trzeba to dokładniej zbadać. W szczególności zastanowiłbym się nad art. 75, ptk 2. podpunktach 1 i 3.


[1] PLD crossming32-binutils.spec
[2] PLD crossming32-gcc.spec
[3] PLD crossming32-runtime.spec
[4] PLD crossming32-w32api.spec
[5] Hoppke'owa przypowiastka o RPM
« Ostatnia zmiana: Maj 04, 2006, 18:46:47 wysłana przez bies »

Offline DarkJarek

  • Użytkownik
    • DarkJarek HomePage

# Maj 04, 2006, 21:13:33
Cytuj
a.      Use.  You may install the software on any number of devices to design, develop and test your programs that run on a Microsoft Windows operating system.
Czyli można korzystać z PSDK na czym chcesz ale programy mają się uruchamiać na Windowsie.

Offline gamecreator

  • Użytkownik
    • Game C++reator - strona o tworzeniu gier w C++

# Maj 05, 2006, 07:25:01
Cytat: bies
w zależności od target podanego do configure buduje Ci się trochę inny kompilator

Właśnie czytam w dokumentacji na stronie GNU :P
Wygląda na to, że mój GCC został zbudowany z opcjami --host=i686-pc-linux-gnu i z domyślnym --target [czyli tym samym]. Natomiast GCC dla MinGW jest budowany pod Linuxem z opcjami --host=i686-pc-linux-gnu --target=i386-mingw32.

Cytat: bies
różne wsparcie dla wątków

To też sprawdziłem ;)  Linux: wątki POSIX. Windows: wątki win32.

Cytat: bies
Jeśli zatem chcesz to próbuj albo szukaj kogoś kto próbował (ja się z takim przypadkiem nie spotkałem).

Właśnie ja też nie, a przekopałem już Google, manuale, archiwa list dyskusyjnych.. Wszędzie pada ta sama odpowiedź: "użyj MinGW i nie zawracaj nam, koderom GCC, głowy" ;P  Jednak to, że jeszcze nikt tego nie próbował, nie znaczy że to niemożliwe ;) Zrobiłem więc kilka dalszych eksperymentów.

Wyczytałem, że GCC korzysta z binutils do pracy z plikami obiektowymi i że można sprawdzić, jakie formaty są obsługiwane, wydając polecenie objdump -i. Miałem pod ręką obie wersje objdump [tą pod Linuxem i tą z partycji windowsowej przez Wine]. Wyniki dały mi trochę do myślenia :P

Linuxowa: a.out-i386-linux efi-app-ia32 elf32-i386 elf32-little elf32-big srec symbolsrec tekhex binary ihex trad-core elf64-x86-64 elf64-little elf64-big
Windowsowa: pe-i386 pei-i386 elf32-i386 elf32-little elf32-big srec symbolsrec tekhex binary ihex

Jak widać, wersja z MinGW obsługuje zarówno PE jak i ELFy ;)  Niestety wersja z Linuxa obsługuje tylko ELFy [inne formaty pomijam bo mnie nie interesują]. Sprawdziłem więc następnie, czy jak skompiluję plik *.o linuxowym GCC, to czy windowsowy objdump prawidłowo rozpozna formaty. Rozpoznał ;J  W drugą stronę się nie udało, bo linuxowy objdump rozpoznawał mi tylko ELFy.

Jak to zrobili goście z MinGW, że kompilowali z tych samych źródeł [jak sądzę - są jakieś inne wogóle? :P], a ich binutils i GCC potrafią obsługiwać oba formaty? Jeśli udało się to na Windows, to powinno dać się też odwrotnie - skompilować binutils i GCC tak, żeby na Linuxie obsługiwały oba formaty [ELFy i PE], a linker LD potrafił generować EXE PE. W dokumentacji jednak nie ma o tym ani słowa, a nie wiem kto mógłby powiedzieć mi coś więcej :/

Próbowałem linkować pliki *.o wygenerowane na linuxowym GCC przy pomocy LD z windowsowego MinGW. Format rozpoznał, na brakujące biblioteki nie narzekał, nie było "unresolved references" ale.... wywalił mi coś takiego:

err:seh:EXC_DefaultHandling Unhandled exception code c0000005 flags 0 addr 0x7bec861b
i zdechł :P
Ten komunikat nie mówi mi nic więcej ponad to, że ma jakiś związek z obsługą wyjątków strukturalnych ;P więc na tym błędzie już poległem :(
Zainstalowałem sobie więc ten cholerny MinGW i może on da mi jakieś hinty co dalej :P

Cytat: bies
Moim zdaniem najłatwiej będzie skompilować wszystko od nowa (tj. jeśli rzeczywiście chcesz kompilować - naprawdę nie masz tego w distro?)

Gentoo ;) Więc tak czy tak leci ze źródełek ;)  ale już mam to za sobą :> Chwila zautomatyzowanej roboty ;D Teraz tylko zostaje mi sprawdzić, czy to będzie działać ;J

Cytat: bies
4) Kompilujesz gcc (wybierasz wszystkie języki jakie Cię interesują) jak w [2].

Szkoda że w wersji dla Gentoo nie mogłem wybrać języka Ada, bo ponoć GCC też go wspiera. A ostatnio mnie qsi żeby zlookać co to za język ;J

Cytat: bies
6) Kompilujesz i instalujesz mingw-runtime i mingw-winapi ([3], [4])

Mniej więcej. Najpierw musiałem zainstalować binutils. Później skompilować GCC. w32api wymagał GCC do skompilowania. Następny był runtime mingw, bo wywalał w32api i GCC jako zależności. I wygląda na to że to już wszystko ;)

Cytat: bies
Jeśli zechcesz znowu (w innym terminalu, sesji) użyć mingw32 pamiętaj aby dodać katalog do $path.

Spoko, takich rzeczy to się jeszcze potrafię domyślić ;D  Wyexportowałem ją sobie w .bash_profile ;)

Cytat: bies
Jeśli nie bardzo rozumiesz instrukcje w [1], [2], [3], [4] to polecam zapoznać się z [5].

Spox, ale budowanie RPMek to już wogóle nie jest mi potrzebne, więc pominę wszystkie ;)

Cytat: DarkJarek
Cytuj
Cytuj
a.      Use.  You may install the software on any number of devices to design, develop and test your programs that run on a Microsoft Windows operating system.
Czyli można korzystać z PSDK na czym chcesz ale programy mają się uruchamiać na Windowsie.

Ja tam nic takiego nie widzę. Pisze tam tylko "Możesz instalować oprogramowanie na dowolnej liczbie urządzeń by projektować, rozwijać i testować twoje programy które działają na systemie operacyjnym Microsoft Windows", co jest jak dla mnie jedynie stwierdzeniem faktu, że to oprogramowanie służy do testowania/rozwijania/whatever programów działających na Windowsie. Nie pisze tam, że KONIECZNIE TRZEBA używać go na Windowsie i tylko tam jest do dozwolone ;J
Ale ta dyskusja i tak nie ma sensu, bo raz że nie na temat, a dwa i tak nie używam oryginalnych headerów z M$ ;)

Offline Vic

  • Użytkownik

# Maj 05, 2006, 07:45:47
Jak to zrobili goście z MinGW, że kompilowali z tych samych źródeł [jak sądzę - są jakieś inne wogóle? :P], a ich binutils i GCC potrafią obsługiwać oba formaty?
Możliwe że to kwestia odpowiedniej konfiguracji źródeł GCC przed kompilacją, ew. dodania kilku plików źródłowych do obsługi PE. (strzelam, jak coś o tym znajdę to podeślę)

agent_J

  • Gość
# Maj 05, 2006, 16:47:08
Jak to zrobili goście z MinGW, że kompilowali z tych samych źródeł [jak sądzę - są jakieś inne wogóle? :P], a ich binutils i GCC potrafią obsługiwać oba formaty?
Możliwe że to kwestia odpowiedniej konfiguracji źródeł GCC przed kompilacją, ew. dodania kilku plików źródłowych do obsługi PE. (strzelam, jak coś o tym znajdę to podeślę)

Do binutils można dodawać różne targety na raz. Przykładowo PE i ELF można wkompilować jednocześnie.
Był któryś parametr do configure. Można sprawdzić przez ./configure 2&>1 | grep target :)

Offline parmezan

  • Użytkownik

# Maj 05, 2006, 16:54:20
Szkoda że w wersji dla Gentoo nie mogłem wybrać języka Ada, bo ponoć GCC też go wspiera. A ostatnio mnie qsi żeby zlookać co to za język ;J
Jeśli ci ~x86 nie straszne to możesz
$ ACCEPT_KEYWORDS=~x86 emerge gnat-gcc