Pregunta

Estamos desarrollando un paquete de software en C ++ que depende de la biblioteca readline de GNU y por lo general construimos utilizando gcc (que requiere al menos la versión 4). Ahora nos gustaría puerto esta a Windows, obteniendo una versión enlazada estáticamente cual podemos redistribuir sin necesidad de compilación de los usuarios.

He intentado varios enfoques:

  • construcción de utilizar Cygwin (sin ir con la readline proporcionado combinado con -mno-cygwin o un compilador MinGW),
  • Edificio utilizando MinGW y readline de GnuWin32 (dependencias no resueltas a stat64, lo que no se pudo resolver),
  • Edificio utilizando MinGW y la construcción de readline y pdcurses requeridas de la fuente (enfoque más prometedor, llegó a un binario estático! Pero el intérprete de comandos interactivo obtenido se comportó de forma incorrecta, por ejemplo, la tecla de retroceso no se visualizó).

¿Alguna idea de cómo podríamos conseguir uno de los enfoques de trabajo?

¿Fue útil?

Solución

Después de frustraciones similares, acabo ahora compilado tanto una versión de 32 bits y 64 bits de libreadline 6,2 usando MinGW-W64 . Aquí está mi cómo lo hice:

Disposición de mi dev directorio:

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

Definición de algunas variables de entorno para la generación de 32 bits:

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

termcap 1.3.1.
Ejecutar el script de configuración:

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

termcap.c Edición y corrección de hasta unas pocas líneas en la parte superior. La mía tiene el siguiente aspecto:

/* 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

y 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 */

Modificar el 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

Después de esa llamada make install y debe compilar sin advertencias o errores.

readline 6,2 < br> Establecer los mismos CPPFLAGS y LDFLAGS variables como con termcap antes de llamar a:

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

Editar el Makefile:

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

make install Ahora debe compilar e instalar readline
Si quieres una biblioteca de 64 bits, reemplace i686-W64-mingw32 con * x86_64-W64-mingw32 * y local32 con local64 .

Otros consejos

MinGWEditLine biblioteca

Una editline implementación de la API para la consola de Windows nativo. Esta biblioteca de licencia BSD ofrece funciones de edición y la historia de línea de comandos similares a los encontrados en GNU Readline.

funciones de readline principales se implementan para la consola de Windows nativo. BSD licencia.

GnuWin32 tiene un puerto de readline: http://gnuwin32.sourceforge.net/packages/readline .htm

para proyectos no GPL, libedit tiene una licencia [usos BSD licencias] más aceptable

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top