2011-01-19 19 views
8

stiamo sviluppando un pacchetto software C++ che dipende dalla libreria GNU readline e di solito creiamo usando gcc (che richiede almeno la versione 4). Ora vorremmo portarlo a Windows, ottenendo una versione collegata staticamente che possiamo ridistribuire senza richiedere la compilazione da parte degli utenti.Libreria di letture correttamente collegata e correttamente funzionante sotto Windows?

ho provato diversi approcci:

  • edificio utilizzando Cygwin (no go con l'apposita readline combinato con -mno-cygwin o un compilatore MinGW),
  • costruzione usando MinGW e readline da GnuWin32 (dipendenze non risolte per stat64, che non ho potuto risolvere),
  • creazione di mingw e creazione di readline e richieste di pdcurses dalla sorgente (l'approccio più promettente, ottenuto con un binario statico!) Ma la shell interattiva ottenuta si è comportata in modo errato, ad esempio il backspace non è stato visualizzato).

Qualche idea su come possiamo ottenere uno degli approcci per funzionare?

thx! Broes

+0

Non conosco quasi nulla sulla programmazione di Windows e non posso aiutarti, ma nota che GNU readline è GPL, quindi non puoi distribuire un pacchetto binario solo (puoi distribuire uno precompilato ma solo binario è violazione del copyright). – AProgrammer

+0

Ah interessante, quali sono esattamente questi requisiti? (il nostro progetto è open-source, quindi possiamo certamente aderire, ma non sono molto competente nel dipartimento delle licenze :). Sono cose come la distribuzione di un binario con un riferimento alla fonte online consentita, o la fonte deve essere inclusa in ogni momento? –

+0

Per questo è necessario un avvocato. Credo che sia consentito il binario con riferimento, a condizione che la fonte originale sia disponibile. Il più grande ostacolo è che il tuo software deve essere anche GPL (non una qualsiasi altra licenza open source potenzialmente più indulgente). C'è un clone readline protetto da BSD chiamato editline in varie fasi di deadness. –

risposta

4

Dopo frustrazioni simili, ho appena compilato sia Versione a 32 e 64 bit di libreadline 6.2 con MinGW-w64. Ecco il mio come ho fatto:

layout del mio dev directory:

c:\dev\msys 
c:\dev\mingw32 
c:\dev\local32 
c:\dev\mingw64 
c:\dev\local64 

Impostare alcune variabili d'ambiente per la compilazione a 32 bit:

export CPPFLAGS=-I/c/dev/local32/include 
export LDFLAGS=-L/c/dev/local32/lib 

termcap 1.3.1.
Eseguire il configurare lo script:

./configure --host=i686-w64_mingw32 --prefix=/c/dev/local32 

Modificare termcap.c e correggere alcune righe nella parte superiore. Il mio aspetto:

/* Emacs config.h may rename various library functions such as malloc. */ 
#ifdef HAVE_CONFIG_H 
#include <config.h> 
#endif 

#ifdef emacs 

#include <lisp.h>  /* xmalloc is here */ 
/* Get the O_* definitions for open et al. */ 
#include <sys/file.h> 
#ifdef HAVE_FCNTL_H 
#include <fcntl.h> 
#endif 
//#ifdef HAVE_UNISTD_H 
#include <unistd.h> 
//#endif 

#else /* not emacs */ 

//#ifdef STDC_HEADERS 
#include <stdlib.h> 
#include <string.h> 
#define bcopy(b1,b2,len) (memmove((b2), (b1), (len)), (void) 0) 
//#else 
//char *getenv(); 
//char *malloc(); 
//char *realloc(); 
//#endif 

e tparam.c

/* Emacs config.h may rename various library functions such as malloc. */ 
#ifdef HAVE_CONFIG_H 
#include <config.h> 
#endif 

#ifdef emacs 
#include "lisp.h"  /* for xmalloc */ 
#else 

//#ifdef STDC_HEADERS 
#include <stdlib.h> 
#include <string.h> 
//#else 
//char *malloc(); 
//char *realloc(); 
//#endif 

/* Do this after the include, in case string.h prototypes bcopy. */ 
//#if (defined(HAVE_STRING_H) || defined(STDC_HEADERS)) && !defined(bcopy) 
#define bcopy(s, d, n) memcpy ((d), (s), (n)) 
//#endif 

#endif /* not emacs */ 

Modificare il Makefile:

Line 23: CC = i686-w64-mingw32-gcc 
Line 24: AR = i686-w64-mingw32-ar 
Line 36: prefix = /c/dev/local32 
Line 49: #oldincludedir = /usr/local 

Dopo quella chiamata make install e dovrebbe compilare senza avvisi o errori.

readline 6.2
impostare lo stesso CPPFLAGS e LDFLAGS variabili come con termcap prima di chiamare:

./configure --prefix=/c/dev/local32 --host=i686-w64-mingw32 --enable-static --enable-shared 

Modificare il Makefile:

Line 40: AR = i686-w64-mingw32-ar 

fanno installare ora dovrebbe compilare e installare readline !
Se si desidera una libreria a 64 bit, sostituire i686-W64-mingw32 con * x86_64-W64-mingw32 * e local32 con local64.

+0

Puoi dare un po 'più di informazioni sulle tue azioni? Ho provato a seguirlo ma sono rimasto bloccato su due problemi. In primo luogo termcap configure ignora le specifiche dell'host e le impostazioni predefinite per il mio unix targeting g ++. In secondo luogo, non esiste un'opzione nella configurazione di readline per specificare il percorso della libreria termcap (o lo hai anche modificato)? –

+0

Ottimo! L'ho fatto funzionare, usando il crosscompiling mingw-w64 da unix, senza dover cambiare i file termcap! Un consiglio utile: puoi specificare gli eseguibili CC, CXX, AR e RANLIB nel comando configure (così puoi lasciare il makefile invariato) –

0

GnuWin32 ha una porta di readline: http://gnuwin32.sourceforge.net/packages/readline.htm

progetti non GPL, libedit ha una licenza più accettabile [utilizza licenze BSD]

+0

Ho già detto che non riuscivo a compilare quella porta sotto Mingw? –

+0

fornire ulteriori dettagli sulla tua piattaforma. Sono stato in grado di costruirlo sulla mia scatola –

2

Partenza MinGWEditLine library

implementazione dell'API Un Editline per la Console nativo di Windows. Questa libreria con licenza BSD fornisce funzioni di modifica e cronologia della riga di comando simili a quelle disponibili in GNU Readline.

Le principali funzioni di lettura sono implementate per la console Windows nativa. Licenza BSD.

Problemi correlati