Oprettelse af programbiblioteker i Windows og LINUX [[C ++]]

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg planlægger at bruge biblioteker i mit C ++-program. Udvikling sker på Linux, men applikationen er designet til at kompilere på både Linux og Windows. Jeg forstår direkte tilsvarende for delte biblioteker (.so) i Windows er DLL, right?


I Linux ved hjælp af g ++ kan jeg oprette delt bibliotek ved hjælp af -fPIC og -shared flag. AFAIK, der er ingen anden kodeændring, der kræves for et delt bibliotek. Men tingene er forskellige i en Windows DLL. Der skal jeg angive de funktioner, der skal eksporteres ved hjælp af dllexport, ikke? [8]


Mit spørgsmål er, hvordan håndterer jeg denne situation? Jeg mener dllexport er ugyldig i Linux, og kompilatoren vil give en fejl. Men det kræves i Windows. Så hvordan skriver jeg en funktion, der vil kompilere på begge platforme uden nogen kodeændring?


Brugte kompilere



  • g ++ - LINUX

  • VC ++ - Windows



Enhver hjælp ville være fantastisk!

Bedste reference


Vi angiver \_\_declspec(dllexport) for klassen:


#define EXPORT\_XX \_\_declspec(dllexport)

class EXPORT\_XX A
{
};


Du kan derefter tjekke efter platform og definere kun makroen på windows. F.eks.:


#ifdef WIN32
#define EXPORT\_XX \_\_declspec(dllexport)
#else
#define EXPORT\_XX
#endif


Vi bygger for det meste statiske biblioteker, så der kan være flere ting at gøre for dynamiske libs, men konceptet er det samme. Brug præprocessor-makro til at definere streng, som du skal indsætte i Windows-kode.

Andre referencer 1


Et andet alternativ er at bare bruge en .def-fil til dit Windows-projekt. Denne fil specificerer DLL-eksporten, så du behøver ikke at rydde op på din kodebase. (Men makroer er bestemt den vej, hvis du vil undgå den ekstra fil.)

Andre referencer 2


Du kan bruge #ifdef præprocessor-direktivet til betinget kompilering. For eksempel:


#ifdef WIN32
    // Win32 specific code
#else
    // Elsewhere
#endif

Andre referencer 3


En anden mulighed, som jeg bruger nu, er at bruge MinGW på Windows. På denne måde kan du bruge gcc på Windows, og du behøver ikke at bekymre dig om declspec nonsens. [9]