Staticamente collegato, correttamente lavorando libreria readline sotto Windows?
-
12-10-2019 - |
Domanda
Stiamo sviluppando un pacchetto software C ++ che dipende dalla libreria GNU readline e noi di solito costruisce utilizzando gcc (che richiede almeno la versione 4). Ora vorremmo quella di portare questo a Windows, ottenendo una versione collegata in modo statico, che siamo in grado di ridistribuire senza richiedere la compilazione dagli utenti.
Ho provato diversi approcci:
- Building utilizzando Cygwin (senza andare con il readline fornito in combinazione con
-mno-cygwin
o un compilatore MinGW), - Costruzione usando MinGW e readline da GnuWin32 (dipendenze non risolte a stat64, che non ha potuto risolvere),
- Costruzione usando MinGW e readline costruzione e pdcurses richiesti dalla sorgente (approccio più promettente, ha ottenuto ad un binario statico! Ma la shell interattiva ottenuto comportato in modo scorretto, per esempio backspace non è stato visualizzato).
Tutte le idee come si potrebbe ottenere uno degli approcci al lavoro?
Soluzione
Dopo frustrazioni simili, ho appena compilato sia una versione a 32bit e 64bit di libreadline 6.2 utilizzando 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 lo script di configurazione:
./configure --host=i686-w64_mingw32 --prefix=/c/dev/local32
Modifica termcap.c e fissare un paio di 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 */
Modifica del 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 < br> Impostare gli stessi CPPFLAGS e LDFLAGS variabili come con termcap prima di chiamare:
./configure --prefix=/c/dev/local32 --host=i686-w64-mingw32 --enable-static --enable-shared
Modifica del Makefile:
Line 40: AR = i686-w64-mingw32-ar
make install dovrebbe ora 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 .
Altri suggerimenti
Un'implementazione dell'API Editline per la Console nativo di Windows. Questa libreria con licenza BSD fornisce funzioni di editing e la storia della linea di comando simili a quelli trovati in GNU Readline.
funzioni readline principali sono implementate per la console nativo di Windows. BSD licenza.
GnuWin32 ha un porto di readline: http://gnuwin32.sourceforge.net/packages/readline htm
progetti non GPL, libedit ha un più accettabile di licenza [usi BSD licenze]