Статически связанная, правильно работающая библиотека чтения под Windows?
-
12-10-2019 - |
Вопрос
Мы разрабатываем программный пакет C ++, который зависит от библиотеки чтения GNU, и мы обычно создаем с помощью GCC (требуя хотя бы версии 4). Теперь мы хотели бы перенести это в Windows, получая статически связанную версию, которую мы можем перераспределить, не требуя компиляции пользователями.
Я попробовал несколько подходов:
- Строительство с использованием cygwin (не Go с предоставленной линией чтения в сочетании с
-mno-cygwin
или компилятор Mingw), - Строительство с использованием Mingw и READLINE от GNUWIN32 (неразрешенные зависимости от STAT64, которые я не смог разрешить),
- Строительство с использованием Mingw и строительного чтения и требовалось PDCurses из источника (наиболее многообещающий подход, достиг статического двоичного файла! Но полученная интерактивная оболочка вела себя неправильно, например, BackSpace не визуализировалась).
Есть идеи, как мы могли бы получить один из подходов к работе?
Решение
После аналогичных разочарований я только сейчас собрал 32 -битную и 64 -битную версию Libreadline 6.2, используя Mingw-W64. Анкет Вот мой, как я это сделал:
Макет моего девчонка каталог:
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
Термин 1.3.1.
Запустите скрипт Configure:
./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
После этого звонка сделать установку и он должен компилировать без предупреждений или ошибок.
Линия чтения 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
сделать установку Теперь должен собирать и установить Rideline!
Если вы хотите библиотеку 64 -битной, замените I686-W64-Mingw32 с * x86_64-W64-Mingw32 * и местный 32 с местный 64.
Другие советы
Проверить Библиотека Mingweditline
Реализация EditLine API для нативной консоли Windows. Эта библиотека, лицензированная на BSD, предоставляет функции редактирования командной строки и историю, аналогичные тем, которые можно найти в GNU Readline.
Основные функции чтения реализованы для нативной консоли Windows. Лицензия BSD.
GNUWIN32 имеет порт чтения: http://gnuwin32.sourceforge.net/packages/readline.htm
Для проектов, не являющихся GPL, Libedit имеет более приемлемое лицензирование [использует лицензирование BSD