c ++ - porte win32 kode (windows.h) til linux

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på et c + + -projekt, hvor jeg har en masse Visual Studio genererede projektfiler, som jeg vil sende til Linux. Jeg bruger i det væsentlige windows.h header-fil i flere filer på Windows. Nu er jeg usikker på, som der udtrykkeligt er eksisterer ingen linux.h fil (incase det gør, venligst guide mig, hvor du skal se på). På Linux bruger jeg Eclipse CDT til udvikling. Jeg har to ideer i tankerne om, hvordan det muligvis ville fungere på linux, men jeg vil have din input for at vide, hvad den rigtige retning er:


(1) For at fjerne Windows API-opkald med Linux API-opkald i C ++-filer. Men det ville betyde, at jeg har fundet tilsvarende funktion i Linux, som jeg ikke er sikker på, hvor jeg skal kigge på. F.eks. Filetime i Win32 svarer til noget i Linux (har ikke fundet denne ting endnu).


(2) Jeg kopierer den grundlæggende syntaks af disse funktioner (som skrevet i windows.h) og skaber bare en headerfil (lad os sige jeg navngiver linux.h) og inkludere denne headerfil i projektet på linux.


Så tilsyneladende har du måske regnet ud, at jeg er forvirret af, hvordan man bevæger tingene fremad. Jeg vil bare arbejde denne ting ud. Foreslå mig ideer/synspunkter bortset fra følgende:
(1) Nej, jeg vil ikke bruge Boost.
(2) Jeg vil ikke omskrive filerne i Visual Studio.

Bedste reference


Det afhænger virkelig af din ansøgning. Hvis det kun er en gui app kommandolinje. Du bør se på at erstatte dine win32-opkald med posix-versioner af funktionerne, der er kompatible med forskellige platforme (Linux, Mac OS X).


Så det er valgmulighed 1. Du kan konvertere Filetime til posix her og pakke det med din egen funktion, der har en #ifdef for hver os, du vil kompilere på.


Valgmuligheder 2 er en smerte, der er blevet gjort det. Men det kan stadig være en mulighed, det afhænger virkelig af, hvor mange Win32 funktioner du har i din kildekode, og hvor forskellige de er fra posix-versionen. Jeg anbefaler ikke denne mulighed.


Mulighed 1 er bedre, når du lærer posix-versionerne af win32-funktionerne og bare stopper med at bruge win32-funktionen så meget som muligt.

Andre referencer 1


Linux implementerer POSIX API. Hvis du følger vej (1), skal du finde udskiftningsoverskrifter og opkald herfra. [2]


Alternativt kan du bruge Winelib til at forsøge at kompilere din Windows-kode 'indbygget' på Linux. Vinprojektet implementerer meget af Windows API, så det kan fungere, og det er teoretisk muligt at genopbygge dit Windows-program til at køre på Linux til ARM, for eksempel, men de giver ingen garanti for det. [3] [[[4]


Men hvis du vil følge den anden vej, skal du kompilere for hver version af vin, som dine brugere måske har installeret, så hvis de er på x86, er det mere fornuftigt at bare give dem det binære sammen med en brugerdefineret vin præfiks konfigureret til en stat kendt for at arbejde. [5]


Et tredje alternativ er at droppe alt dette og omskrive ved hjælp af et værktøjssæt som Qt, der vil krydstilstand i Windows/Mac/Linux og slippe direkte opkald til det underliggende operativsystem. Hvis du finder din kode ofte nødt til at arbejde på tværs af forskellige operativsystemer, er dette nok det bedste valg. [6]

Andre referencer 2


Det lyder som om du vil have Windows API'er på Linux. Jeg tror, ​​at du også bør overveje at gøre din C ++-kode bærbar ved at erstatte Windows API-opkald med bærbare biblioteker som STL og Boost.


Men hvis du virkelig ikke kan det, så kig ind på WineHQ, som er en implementering af Windows API'er på Linux. [7]