Windowsの下で、静的にリンクされた、正しく動作するReadlineライブラリ?
-
12-10-2019 - |
質問
GNU Readlineライブラリに依存するC ++ソフトウェアパッケージを開発しており、通常はGCC(少なくともバージョン4が必要)を使用して構築しています。これをWindowsに移植し、ユーザーによるコンピレーションを必要とせずに再配布できる静的にリンクされたバージョンを取得したいと思います。
いくつかのアプローチを試しました:
- Cygwinを使用して構築(提供されたReadlineと組み合わせたものと一緒に行きます
-mno-cygwin
またはMingwコンパイラ)、 - gnuwin32のmingwとreadlineを使用して構築します(解決されていない依存関係がSTAT64への依存関係がありますが、これは解決できませんでした)、
- MINGWを使用してBuilding ReadlineとSourceからの必要なPDCURSEを使用して構築します(最も有望なアプローチは静的バイナリに到達しました!しかし、得られたインタラクティブシェルは誤って動作しました。
仕事へのアプローチの1つを取得する方法はありますか?
解決
同様のフラストレーションの後、私は今、Libreadline 6.2の32ビットバージョンと64ビットバージョンの両方を使用してコンパイルしました。 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
Termcap 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
その呼び出しの後 インストールします また、警告やエラーなしでコンパイルする必要があります。
ReadLine 6.2
呼び出す前に、TermCapと同じCPPFLAGSとLDFLAGS変数を次のように設定します。
./configure --prefix=/c/dev/local32 --host=i686-w64-mingw32 --enable-static --enable-shared
makefileを編集します:
Line 40: AR = i686-w64-mingw32-ar
インストールします これで、readlineをコンパイルしてインストールする必要があります!
64ビットライブラリが必要な場合は、交換してください I686-W64-MINGW32 * x86_64-w64-mingw32 * and local32 と local64.
他のヒント
チェックアウト Mingweditlineライブラリ
ネイティブWindowsコンソールの編集API実装。このBSDライセンスライブラリは、GNU Readlineで見つかったものと同様のコマンドライン編集と履歴関数を提供します。
ネイティブWindowsコンソールには、メインReadLine関数が実装されています。 BSDライセンス。
Gnuwin32には、読み取りポートがあります。 http://gnuwin32.sourceforge.net/packages/readline.htm
非GPLプロジェクトの場合、Libeditにはより受け入れられるライセンスがあります[BSDライセンスを使用