Hogyan migráljunk Win32 C/C++ programokat linux alá

Címkék

Az IBM developerworks-ön megjelent egy útmutató, ami a Win32-re írt programok Linux alá migrálásában segít. Bár a cikk a címe szerint Power architektúrára való migrálásról szól, de a tanácsainak döntő része igaz PC esetében is.

Hozzászólások

Tanulságos lenne, ha egy BSD szakértő ideirná, hogy mennyiben lenne más a cikk, ha Win32->BSD-ről szólna.

thx

szép a cikk.

csak annyi a hibája, hogy pure WinAPI programozást feltételez, amit gyakorlatilag az elborzasztó nehézsége miatt senki sem csinál. Ehelyett inkább a winAPI-t MFC-be, Visual Basic-be, QT-be, C++Builder-be, Delphi-be vagy .NET-be csomagolva használják, hogy egyáltalán emészthető legyen.

na azokra ez a leírás szinte semmit sem ér ;)

Ami "linuxos" programot a cikkben leírva láttam az nagyrészt posix-os, szóval szerintem egy az egyben jó kell, hogy legyen BSD-re is. Egyébként ha érdekel, nézd végig a cikkben kigyűjtött függvényhívások man oldalait; a legtöbb esetben a CONFORMING TO részben a POSIX mellett ott lesz a 4.4BSD vagy BSD 4.3 is. (Amúgy nem vagyok BSD szakértő)

A cikket nem olvastam. Ez nagyban fugg a stanardoktol pl POSIX. A libraryk használatától. De ha veszunk egy olyan peldat, hogy quakeworld (quake1) ami mondjuk az SDL libraryt használja akkor azt te windowson, *bsd -n, linuxon, solarison meg egyeb mas OS -n is szinte 80% os sikerrel le fogod perditeni es valoszinuleg futni is fog. Ez nagyban fugg a használt funkcióktól is természetesen. Nézhetjük xchat et is amely windowsra is elérhető. CTCP Versionra reply elott a kliens kiolvassa a CPU infokat. Ezt linux eseten procfs bol, *BSD esetén sysctl segítségével.

Ezért láthatóak az ilyen kódrészletek:

#if defined(__linux__)

olvasd_ki_procfsbol();

#elif defined(__FreeBSD__) || defined(__OpenBSD__)

olvasd_ki_sysctlbol();

#endif

Ez a "portolható" kód. Ha egy programozó előre gondolkodik akkor késpőbb nem kell egy 50000+ soros kódbázist szinte teljesen átírni.

Most ha megnezem mondjuk a strlen(3) manpaget, linuxon és OpenBSD -n ennyit láthatunk:

OpenBSD:

-------------

STANDARDS

The strlen() function conforms to ANSI X3.159-1989 (``ANSI C'').

Linux:

--------------

CONFORMING TO

SVID 3, POSIX, BSD 4.3, ISO 9899

Persze ezek windows-ra is vonatkoznak. Tehát ha megézem WinSock API -ba az inet_ntoa(); functiont akkor ezt láthatjuk:

#include

char FAR * PASCAL FAR inet_ntoa ( struct in_addr in );

BSD -n pedig:

SYNOPSIS

#include

#include

#include

#include

char *

inet_ntoa(struct in_addr in);

Tehát a dolgunk csak annyi, hogy eldöntjük milyen OS en vagyunk és egy #ifdef segítségével a megfelő headereket includeoljuk.