Question

Nous développons un logiciel C ++ qui dépend de la bibliothèque GNU readline et nous construisons habituellement en utilisant gcc (nécessitant au moins la version 4). Maintenant, nous aimerions au port ce Windows, obtenir une version dynamique que nous pouvons redistribuer sans nécessiter la compilation par les utilisateurs.

J'ai essayé plusieurs approches:

  • bâtiment en utilisant Cygwin (allez pas avec le readline fourni combiné avec -mno-cygwin ou un compilateur MinGW),
  • bâtiment en utilisant MinGW et readline de GnuWin32 (dépendances non résolues à stat64, que je ne pouvais pas résoudre),
  • bâtiment en utilisant MinGW et la construction readline et PDCURSES nécessaires de la source (approche la plus prometteuse, obtenu à un binaire statique! Mais le shell interactif obtenu un comportement incorrect, par exemple backspace n'a pas été visualisé).

Toutes les idées comment nous pourrions obtenir l'une des approches de travail?

Était-ce utile?

La solution

Après des frustrations semblables, je viens maintenant compilé à la fois une version 32 bits et 64 bits de libreadline 6.2 en utilisant MinGW-w64 . Voici mon comment je l'ai fait:

Mise en page de mon dev :

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

Définir des variables d'environnement pour la construction 32 bits:

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

termcap 1.3.1. Exécutez le script de configuration:

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

Modifier termcap.c et réparer quelques lignes en haut. Le mien ressemble à ceci:

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

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

Modifier le 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

Après cet appel make install et il devrait compiler sans avertissements ou des erreurs.

readline 6.2 < br> Définissez les mêmes variables CPPFLAGS et ldflags comme avec termcap avant d'appeler:

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

Modifier le Makefile:

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

make install devrait maintenant compiler et installer readline!
Si vous voulez une bibliothèque de 64 bits, remplacez i686-w64-mingw32 avec * x86_64-w64-mingw32 * et local32 avec local64 .

Autres conseils

Consultez bibliothèque MinGWEditLine

  

Une implémentation de l'API editline pour la console Windows natif. Cette bibliothèque sous licence BSD fournit des fonctions d'édition et de l'historique ligne de commande semblables à ceux trouvés dans GNU Readline.

Principales fonctions readline sont mises en œuvre pour la console native de Windows. licence BSD.

GnuWin32 a un port de readline: http://gnuwin32.sourceforge.net/packages/readline .htm

pour les projets non GPL, libedit a une licence plus acceptable [utilise des licences BSD]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top