Sign in Join
Wiki copytemporary

Cross compiling for Win32 under Linux/hu: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-<font size="7">Keresztfordítás Windows-ra Linux rendszeren</font>
1+Keresztfordítás Windows-ra Linux rendszeren
22
33## Tippek Win32 binárisok keresztfordításához Linux rendszeren
44
55A 0.9.10 óta létezik egy rpm 'fpc-crosswin32' néven, ami telepíti szükséges binutils eszközöket (assembler, linker), az FPC .ppu fájljait win32-re keresztfordítva és a módosított /etc/fpc.cfg.
66
77A csomag nem tartalmazza a keresztfordított LCL .ppu fájlokat. Neked kell lefordítanod őket az fpc-crosswin32 telepítése után.
88
99## A Lazarus és a Free Pascal Compiler
1010
1111### A keresztfordításról - Hogy tudd mit csinálsz
1212
1313Ez egy rövid bevezetés kezdőknek. A következőkben leírjuk hogyan állítsd be a rendszert keresztfordításhoz, ami azt jelenti, hogy Linux rendszeren dolgozva készíthetsz Win32 alkalmazásokat (és ugyanígy FreeBSD, Darwin, stb.). Amiért jó a keresztfordítás: A FreePascal egy fordító és forráskódból gépi kódú bináris állományokat készít. Ez a bináris tartalmaz információkat arról is hogy az operációs rendszer milyen módon kezelje az állományt. Mindezek miatt a készített bináris állományok rendszerfüggők. Maga a FreePascal nem igényel sok beállítást. Képes binárisokat készíteni sok rendszerhez, csak kérd meg rá. A fordító azonban csak egy rész. Szükségünk van még assemblerre és a linkerre is. Az FPC rendelkezik beépített assemblerrel és/vagy linkerrel néhány rendszerhez, más rendszereken külső eszközökre van szüksége. Ezek az eszközök általában nem képesek binárisokat létrehozni eltérő rendszerek számára. Ezért van, hogy speciális linkert 'ld' és assemblert 'as' használunk minden célrendszeren. Ezeket nevezzük binutils-nak. Miután létrehoztuk (vagy megszereztük/telepítettük) a keresztfordító eszközöket, szükség lesz még az FPC RTL és további unitokra a választott célrendszerre lefordítva. Például minden célrendszerhez eltérő system.ppu (System unit) fájlra van szükség, stb. Miután az fpc config fájl beállítása megtörtént, a keresztfordítás könnyűvé válik, elfeledkezhetsz az unalmas részletekről. Ugyanezt kell tenni az LCL (lazarus component library) esetén is (ha Lazarus-t használsz). Ezután már fordíthatod is a pascal programokat a win32 rendszerre. Az elkészült binárisok futtathatók a Wine segítségével vagy átmásolhatók egy olyan gépre amin win32 fut és ott kipróbálhatók.
1414
1515### Miért *nix rendszerről windows rendszerre és nem a másik irányba?
1616
1717A legfőbb ok az, hogy Unix binárisok létrehozása más rendszereken (másik Unix vagy akár Linux is) jóval bonyolultabb.
1818
1919Szükséged lehet függvénytárakra (library) a célrendszerről (gtk, glib,libc etc), és rengetek finomhangolás elvégzésére van szükség az ld számára (függvénytárak helyei, dynlinker helye, stb.).
2020
2121Ezek részlegesen megoldottak (a statikus linkelés esetén), de nehéz feladat mert utólagos kézi szerkesztést igényel a linker fájlokban és a parancssorban, és széles ismereteket arról ahogy a Unix binárisok működnek.
2222
2323### Töltsd le az FPC forráskódját
2424
2525A binárisok letöltése nem elég, szükséged van a teljes FPC forráskódra. Megtalálod az www.freepascal.org címen. Használhatod a CVS-t vagy a napi kódot (snapshot). A következő példák esetében az FPC forráskódja a ~/sources/fpc könvtárba lettek letöltve.
2626
2727### Töltsd le a GNU binutils programokat.
2828
2929Például a binutils-2.18.tar.gz fájlt töltsd le ide: ~/download/binutils-2.18.tar.gz.
3030
3131### A binutils programok keresztfordítása
3232
3333Az fpcbuild tárhelyén megtalálható egy szkript amivel létre lehet hozni a binutils programokat minden rendszerre: install/cross/buildcrossbinutils
3434
3535Töltsd le és telepítsd az fpcbuild csomagot:
3636
3737` []$ cd ~`\
3838` []$ svn co `[`http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_2/install`](http://svn.freepascal.org/svn/fpcbuild/branches/fixes_2_2/install)` install`
3939
4040Készíts másolatot a szkriptről:
4141
4242` []$ cd ~/install/cross/`\
4343` []$ cp buildcrossbinutils buildcrossbinutils.sh`
4444
4545Szerkesztd a változókat az új szkript elején.
4646
4747A BASE változó mutatja meg a fordítás és telepítés könyvtárát . Ezért ez lehetőleg egy üres könyvtár legyen. Például:
4848
4949` BASE=~/cross_fpc`
5050
5151Most következnek a letöltött binutils programok. Ha a csomagot a ~/download/binutils-2.18.tar.gz néven mentetted akkor a beállítások a következőképpen nézzenek ki:
5252
5353` BINUTILSPATH=~/download/`\
5454` BINUTILSBASE=binutils`\
5555` BINUTILSVERSION=2.18`\
5656` BINUTILS_GZIP=yes`
5757
5858A szkript automatikusan összeállítja belőlük az eredeti nevet: ~/download/binutils-2.18.tar.gz. A további változók a célrendszert határozzák meg. Alapértelmezés szerint szép csendben több rendszerre is lefordítja a kódot, ezért a fordítás sok időt (lassú gépeken órákat) vehet igénybe. Ha csak windows-ra akarsz keresztfordítani akkor csak ennyi kell:
5959
6060` TARGETS_WIN="mingw32"`\
6161` `
6262
6363a többit pedig megjegyzésbe kell áttenni:
6464
6565` #BSD="freebsd netbsd openbsd"`\
6666` #TARGETS_WIN="cygwin mingw32 msdosdjgpp"`\
6767` #TARGETS_I386="${BSD} linux solaris darwin"`\
6868` #TARGETS_POWERPC="${BSD} linux darwin"`\
6969` #TARGETS_SPARC="${BSD} linux solaris"`\
7070` #TARGETS_M68k=`
7171
7272Ezután futtasd a szkriptet:
7373
7474` []$ sh buildcrossbinutils.sh`\
7575` `
7676
7777A szkript létrehozz a 'logs' nevű alkönyvtárat tele naplófájlokkal. Ha valami rosszul megy akkor itt kezdj nyomozni.
7878
7979Ne felejtsd el, hogy több rendszerhez (Linux, FreeBSD, win32) ezek az eszközök már elérhetők lefordítva is. Lásd: <ftp://freepascal.stack.nl/pub/fpc/contrib/cross/>
8080
8181### Az FPC keresztfordítása
8282
8383Az fpcbuld tárhelyén megtalálható egy szkript az FPC napi kód (snapshot) keresztfordításához több rendszerhez: install/cross/buildcrosssnapshot Készíts másolatot a szkriptről:
8484
8585` []$ cd ~/install/cross/`\
8686` []$ cp buildcrosssnapshot buildcrosssnapshot.sh`
8787
8888Szerkesztd a változókat az új szkript elején.
8989
9090Általában csak a CROSSTOOLSROOT, FPCCVS, DESTDIR, TARGETS_OS és TARGETS_CPU értékeit kell beállítanod. Például:
9191
9292` CROSSTOOLSROOT=~/cross_fpc/cross`\
9393` FPCCVS=~/sources/fpc`\
9494` TARGETS_OS="win32"`\
9595` TARGETS_CPU="i386"`\
9696` DESTDIR=~/cross_fpc/`\
9797` `
9898
9999Ezután futtasd a szkriptet:
100100
101101` []$ sh buildcrosssnapshot.sh`
102102
103103Ezután a megtalálod a keresztfordított unit fájlokat a ~/cross_fpc/ könyvtárban.
104104
105105### Az fpc.cfg beállításai
106106
107107Rendszergazdaként nyisd meg az /etc/fpc.cfg fájlt vagy készíts másolatot az /etc/fpc.cfg fájlról ~/fpc.cfg néven, majd szerkesztd ezt a fájlt. Keresd meg benne a unit-ok útvonalait meghatározó részt.
108108
109109Ne felejtsd el, hogy a régebbi FPC változatok a \$version és \$target változókat használják az \$fpcversion és \$fpctarget helyett.
110110
111111`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget`\
112112`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*`\
113113`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl`
114114
115115Cseréld le őket az egyes rendszereknek megfelelő útvonalakra. Pélául normál Linux és keresztfordított win32 esetében így:
116116
117117`#IFDEF win32`\
118118`-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/i386-win32/units/`\
119119`-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/i386-win32/units/*`\
120120`-Fu~/cross_fpc/lib/fpc/$fpcversion/cross/i386-win32/units/rtl`\
121121`-XPi686-mingw32-`\
122122`-FD~/cross_fpc/cross/bin`\
123123`#ELSE linux`\
124124`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget`\
125125`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*`\
126126`-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl`\
127127`#-Fu~/fpc/packages/*;~/fpc/rtl/linux`\
128128`#ENDIF`
129129
130130Tennivaló: Tesztelés és hibaelhárítás
131131
132132### Az LCL és a Lazarus komponensek keresztfordítása
133133
134134Parancssorban:
135135
136136`cd lazarus; make clean all OS_TARGET=win32`\
137137`cd lazarus/lcl; make clean all `
138138
139139Ez először lefordít mindent win32 rendszerre (beleértve az IDE-t is, ami nem szükséges ).
140140
141141Vagy az IDE-ben: Állítsd be az LCL, Synedit, Codetools, Package Registration és IDE Interface fordítását Clean+Build-re, az LCL interface-t win32/win64-re és a 'Target OS' (célrendszer) pedig win32 legyen. Ezután fordítsd újra a Lazarus-t ('build lazarus'). Ez a négy rész külön könyvtárba kerül, ezért a linux .ppu/.o fájlok *nem* lesznek felülírva és nem kell újrafordítanod őket.
142142
143143### Egy projekt keresztfordítása
144144
145145Kattints a Project-\>Compiler Options menüpontra és a Code fülön állítsd be a célrendszert (Target OS) 'win32'-re, a Paths fülön pedig az 'LCL Widget Type'-t szintén 'win32'-re. Ennyi. A következő fordításnál win32 binárist fogsz létrehozni. Az IDE újraellenörzi a win32 unit-okat, így a 'Find declaration' és a 'code completion' lehetőségek a win32 és nem a linux rtl adataival működnek majd. Amikor új projectet nyitsz meg vagy újra megnyitod ezt, az IDE automatikusan váltani fog.
146146
147147### Tippek a Keresztfordításhoz Lazarus-ban
148148
149149Ha több célrendszerre készítesz alkalmazást/csomagot, a következő műveleteket kell sokszor elvégezned: Hibajavítás, fordítás és tesztelés linux-on, aztán fordítás és tesztelés win32 rendszeren, ... Mivel normál esetben felülírod a .ppu fájlokat, újra kell fordítanod mindent, minden alkalommal amikor váltasz. De erre már nincs szükség. A Lazarus IDE támogatja a makrókat.
150150
1511511\. példa: Egy projekt keresztfordítása linux és win32 rendszerekre.
152152
153153Állítsd be a Project-\>Compiler Options-\>Paths-\>Unit Output directory értékét \$(TargetOS)-ra. Ez a makró le lesz cserélve a Code-\>TargetOS sorban található értékre csak kisbetűkkel (pl. "linux"-ra a Linux és "win32"-re a Win32 esetében). A kimeneti könyvtár egy relatív útvonal lesz a projekt könyvtárához iszonyítva (ahol az .lpi fájl található). Létre lesz hozva egy-egy könyvtár linux és win32 néven a projekt könyvtárában. Amikor a "Show Options" gombra kattintasz a 'Compiler options' alján, egyebek mellett látni fogod a -FElinux/ vagy -FEwin32/ paramétereket. Ezek határozzák meg, hogy hová kerüljön kimenet (a .ppu/.o fájlok).
154154
1551552\. Példa: Projekt keresztfordítása különböző rendszerekre és eszközkészletekre (widget set).
156156
157157Állítsd be a 'Unit output directory' értékét így: \$(TargetCPU)/\$(TargetOS)/\$(LCLWidgetType) és hozd létre a könyvtárakat minden célrendszerhez. Ezt a könyvtárszerkezetet használja az LCL is.
158158
159159Ugyanezeket kell elvégezni a csomagok esetében is.
160160
161161### Lazarus csomagok keresztfordítása
162162
163163A Lazarus csomagok nincsenek függvénytárakra korlátozva. Szinte mindenre lehet használni. Az IDE pedig szükség esetén újrafordítja őket. A csomagok örökölhetik a fordítási paramétereket. Például: A projekt amelyik a csomagot használja örökli a csomag kimeneti könyvtárát. Más szavakkal: a csomag kimeneti könyvtára hozzá lesz adva a projekt unit-ok könyvtárainak listájához (unit search path). Az IDE-ben itt találod: Project -\> Compiler options -\> Inherited. Az öröklés általában csak egy irányba működik. De vannak kivételek: A projekt célrendszerének beállítása (OS és CPU) felülbírálja az összes csomag célrendszerbeállítását. Ez azt jelenti, hogy ha a projekt célrendszerét win32-re állítod és fordítod a projektet, az IDE elenörzi, hogy a használt csomagokat újra kell-e fordítani erre a célrendszerre.
164164
165165Például:
166166
167167Az A csomag kimeneti könyvtára: lib/\$(TargetOS) A projekt használja az A csomagot.
168168
1691691. A projekt linux rendszerre készül. Az IDE lefordítja az A csomagot linux rendszerre a \<PackageDirOfA\>/lib/linux/ könyvtárba, ezután lefordítja a csomagot linux rendszerre.
1701702. A csomag win32 rendszerre készül. Az IDE lefordítja az A csomagot win32 rendszerre a \<PackageDirOfA\>/lib/win32/ könyvtárba, ezután lefordítja a csomagot win32 rendszerre.
1711713. A projekt ismét linux rendszerre lesz fordítva. Az IDE ellenörzi, hogy az A csomag le lett-e már fordítva linux rendszerre és nem fordítja újra. Ezután lefordítja a projektet linux rendszerre.
172172
173173A makrók hazsnálatával sok időt lehet megtakarítani.
174174
175175## Unix rendszerre (általános)
176176
177177Az -XLA paraméterrel tudod a pascal unit-ban megadott függőségeket átnevezni. Formátuma -XLAold=new, az ld paramétere pedig -l\<régi\> helyett -l\<új\> legyen.
178178
179179Az -XR\<sysroot\> paraméterrel megadhatod a célrendszerhez használt gyökérkönyvtárat. Amire a következők miatt lehet szükség:
180180
181181- előtag illesztése a függvénytárak útvonala elé; a múltban a -Xd használatával és az útvonalak kézi megadásával lehetett elérni ugyanezt. Például i386-linux esetén az ld számára a /lib, /usr/lib, és /usr/X11R6/lib átadása helyett a \<sysroot\>/lib, \<sysroot\>/usr/lib, és \<sysroot\>/usr/X11R6/lib kerül átadásra.
182182- felismerni a C függvénytárat (linux függő): glibc vagy uclibc. Például uclibc keresése esetén a '\<sysroot\>/lib/ld-uClibc.so.0' lesz használva.
183183
184184## Linux rendszerre Win32 alatt
185185
186186Információkat a [[buildfaq/hu|buildfaq]] részben találsz erről.
187187
188188## FreeBSD-ről sparc-ra
189189
190190Végigcsináltam egy keresztfordítást x86-ról Sparc Solaris 9 rendszerre. Azonban az eredmény nem volt megfelelő. Itt a parancsror amit futtattam:
191191
192192` gmake cycle CPU_TARGET=sparc OS_TARGET=solaris CROSSBINUTILPREFIX=solaris-sparc- CROSSOPT='-Xd -Fl~/src/sollib'`
193193
194194Az ~/src/sollib egy könyvtár ami a következőket tartalmazta:
195195
196196- több .o fájlt a /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3 könytvtárból
197197- a libgcc.a fájlt a /usr/local/gcc-3.3-32bit/lib/gcc-lib/sparc-sun-solaris/3.3 könytvtárból
198198- több lib*.so fájlt a /usr/lib könyvtárból: libaio.so libmd5.so libc.so libelf.so librt.so libdl.so libm.so
199199
200200A problémát a következő példa mutatja meg.
201201
202202` Free Pascal Compiler version 2.1.1 [2006/03/17] for sparc`\
203203` Copyright (c) 1993-2005 by Florian Klaempfl`\
204204` Target OS: Solaris for SPARC`\
205205` Compiling system.pp`\
206206` system.pp(15,1) Fatal: Syntax error, "BEGIN" expected but "identifier UNIT" found`
207207
208208Azt gyanítom, hogy rossz .o fájlokat kapott.
209209
210210## Mac OS X
211211
212212Nézd meg ezt a [fórum bejegyzést](http://www.lazarus.freepascal.org/index.php?name=PNphpBB2&file=viewtopic&p=7222#7222) (angol).
213213
214214## Eredeti közreműködők
215215
216216Ez az oldal az epikwiki [változat](http://lazarus-ccr.sourceforge.net/index.php?wiki=CrossCompilingForWindowsUnderLinux) átalakításával készült.
217217
218218---
219219*From the Free Pascal wiki, page "Cross compiling for Win32 under Linux/hu", as it stood on 2021-07-20 after a change by Dbannon, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
220220Category: Magyar

Back to history