c ++ - Opbygning af statiske biblioteker til Windows, der bruger cygwin

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at bygge CGAL til Windows til brug i mit projekt under Visual Studio 2010. CGAL kræver GMP- og MPFR-biblioteker og giver dem distribution. Det giver dem som et lib + dll-bundle, mens jeg vil have dem samlet statisk i form af en enkelt .lib-fil. [23] [24] [25]


Så nu forsøger jeg at bygge GMP og MPFR som et statisk bibliotek under vinduer. Jeg bruger cygwin til dette formål som foreslået her. Efter opkald til configure og make har jeg output libs med .a udvidelse med yderligere .la fil. Jeg ved ikke rigtig meget om statiske biblioteker til Unix, så jeg foreslog, at det er det samme som .lib med bare en anden udvidelse. Jeg omdøbte det til .lib og var knyttet til mit projekt - det passer godt.]]


Det første spørgsmål : Har jeg det korrekt at gøre det? Er .a og .lib filer virkelig det samme? Jeg så dette spørgsmål, men fandt det ikke nyttigt nok.


Så opstod der problemet: Jeg havde


error LNK2019: unresolved external symbol \_\_\_getreent referenced in function \_\_\_gmp\_default\_reallocate


Det ser ud til, at nogle cygwin-funktioner ikke er forbundet med resulterende gmp.lib. Jeg fandt her, at getreent må eksporteres fra libcygwin.a. Så jeg kopierede det til libcygwin.lib og knyttet til mit projekt. Ikke overraskende fik jeg følgende fejl: [28]


error LNK2005: \_strcpy already defined in libcygwin.lib(t-d001719.o) in libcmtd.lib(strcat.obj) 


Selvfølgelig kan jeg ikke vide, hvad funktioner og hvordan erklæres i dette bibliotek og synes at være strcpy er i modstrid med en fra Visual Studio. Hvad jeg virkelig vil ske er gmp.lib ville være smart nok til at forbinde denne funktion statisk. Så,


Det andet spørgsmål : Sådan tvinges GMP til at forbinde bibliotekets afhængigheder? eller Hvordan man korrekt opbygger GMP til Windows uden at bruge cygwin?

Bedste reference


OPDATERING: Se MPIR-projektsiden for svaret på alle dine problemer (det giver dig mulighed for at opbygge MPIR, et GMP-kompatibelt bibliotek og MPFR med Visual Studio). Den nye MPIR hjemmeside er placeret her, men mangler MPFR info så vidt jeg kan fortælle. [29] [30]





Du vil ikke have Cygwin.


Du har brug for en Bash skal og MinGW (.org/-w64). Hvis du bygger med cygwin compileren, skal du linke til Cygwin DLL, som i dit tilfælde er dum, da GMP og MPFR begge kan bygges af MinGW.


Det eneste er: Jeg tror ikke, at biblioteket kan opbygges af MSVC, og MSVC kan ikke forbindes med MinGW-biblioteker (det er netop grunden til, at dit projekts forfattere bundtede DLL'er og importbiblioteker), så du vil skal bygge alt sammen med MinGW GCC eller bruge DLL'erne.





Nedenfor er instruktioner til opbygning af et GCC statisk bibliotek af GMP og MPFR.


For at kunne opbygge GMP til Windows med MinGW-w64 GCC skal du bruge MSYS. Udpak dette på et eller andet sted som C: \ Dev \ msys, så C: \ Dev \ msys \ bin \ sh.exe er til stede. [31]]]


Så skal du have en MinGW-w64 GCC:



  • 32-bit

  • 64-bit



(Jeg anbefaler mine 'Personlige Bygninger', især 4.6.3-1-pakken. Download pakken 4.6.3-1-gcc\_rubenvb.7z, men enhver anden MinGW-pakke skal gøre for dette) [32] [33]]]


Udpak det for at sige C: \ Dev \ mingw64, så C: \ Dev \ mingw64 \ bin \ gcc.exe eksisterer.


Dobbeltklik på C: \ Dev \ msys \ msys.bat. Type:


export PATH=/c/Dev/mingw64/bin:$PATH


Og tryk på enter. Udpak GMP- og MPFR-kilden til dit/hjem/USERNAME/ * -katalog, lav byggekataloger og husk at bruge til konfiguration:


--enable-static --disable-shared --prefix=/easytemplibinstalldir


sammen med


--host=i686-w64-mingw32


for 32-bit eller


--host=x86\_64-w64-mingw32


for 64-bit. Jeg mener, at GMP også kræver --build sat til samme værdi. Efter konfiguration afslutter du make og derefter make install, eventuelt efterfulgt af make check.


Du skal have libgmp.a i/easytemplibinstalldir/lib. For MPFR, tilføj


--with-gmp=/easytemplibinstalldir


til sin konfigurationslinje.


Du skal manuelt forbinde både libgmp og libmpfr i den rigtige rækkefølge, for at den kan fungere, ingen automatiseret afhængighedsforbindelse er mulig på Windows til dette.