Статически связанная, правильно работающая библиотека readline под Windows? - PullRequest
8 голосов
/ 19 января 2011

Мы разрабатываем программный пакет C ++, который зависит от библиотеки GNU readline, и мы обычно строим с использованием gcc (требуется как минимум версия 4). Теперь мы хотели бы перенести это на Windows, получив статически связанную версию, которую мы можем распространять, не требуя компиляции пользователями.

Я пробовал несколько подходов:

  • Сборка с использованием Cygwin (без использования предоставленной readline в сочетании с -mno-cygwin или компилятором MinGW),
  • Сборка с использованием MinGW и readline из GnuWin32 (неразрешенные зависимости от stat64, которые я не смог разрешить),
  • Сборка с использованием MinGW и сборкой readline и требуемых pdcurses из источника (наиболее многообещающий подход - получить статический двоичный файл! Но полученная интерактивная оболочка работала неправильно, например, backspace не визуализировалось).

Есть идеи, как мы могли бы заставить один из подходов работать?

Ответы [ 3 ]

4 голосов
/ 14 марта 2011

После подобных разочарований я только что скомпилировал 32-битную и 64-битную версию libreadline 6.2, используя MinGW-w64 .Вот как я это сделал:

Макет моего каталога dev :

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

Установка некоторых переменных среды для 32-битной сборки:

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

termcap 1.3.1.
Запустите скрипт конфигурации:

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

Отредактируйте termcap.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>       /* 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

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

Измените 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

После этого вызова make install и он должен компилироваться без предупреждений или ошибок.

readline 6.2
Установите перед вызовом те же переменные CPPFLAGS и LDFLAGS, что и с помощью termcap:

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

Отредактируйте Makefile:

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

make install должен скомпилировать и установить readline!
Если вам нужна 64-битная библиотека, замените i686-w64-mingw32 с * x86_64-w64-mingw32 * и local32 с local64 .

2 голосов
/ 13 апреля 2011

Извлечение Библиотека MinGWEditLine

Реализация API EditLine для встроенной консоли Windows.Эта BSD-лицензированная библиотека предоставляет функции редактирования командной строки и истории, аналогичные тем, которые можно найти в GNU Readline.

Основные функции readline реализованы для собственной консоли Windows.Лицензия BSD.

0 голосов
/ 10 февраля 2011

gnuwin32 имеет порт readline: http://gnuwin32.sourceforge.net/packages/readline.htm

для проектов не-GPL, libedit имеет более приемлемое лицензирование [использует лицензирование BSD]

...