2011-01-19 46 views
8

chúng tôi đang phát triển một gói phần mềm c ​​++ phụ thuộc vào thư viện readline GNU và chúng tôi thường xây dựng bằng gcc (yêu cầu ít nhất là phiên bản 4). Bây giờ chúng tôi muốn chuyển cửa sổ này sang cửa sổ, lấy phiên bản được liên kết tĩnh mà chúng tôi có thể phân phối lại mà không yêu cầu người dùng biên dịch.Được liên kết tĩnh, thư viện readline hoạt động chính xác trong các cửa sổ?

Tôi đã thử nhiều phương pháp:

  • xây dựng sử dụng Cygwin (không đi với cung cấp readline kết hợp với -mno-Cygwin hoặc một trình biên dịch mingw),
  • xây dựng sử dụng mingw và readline từ GnuWin32 (phụ thuộc chưa được giải quyết cho stat64, mà tôi không thể giải quyết),
  • xây dựng bằng cách sử dụng mingw và xây dựng readline và pdcurses bắt buộc từ nguồn (cách tiếp cận đầy hứa hẹn nhất, nhận được một nhị phân tĩnh!).

Bất kỳ ý tưởng nào về cách chúng tôi có thể nhận được một trong các cách tiếp cận để làm việc?

thx! Broes

+0

Tôi biết gần như không có gì về lập trình windows và không thể giúp bạn, nhưng lưu ý rằng GNU readline là GPLed, vì vậy bạn không thể phân phối gói nhị phân chỉ (bạn có thể phân phối trước khi biên dịch nhưng nhị phân chỉ là vi phạm bản quyền). – AProgrammer

+0

Thú vị, chính xác những yêu cầu đó là gì? (dự án của chúng tôi là nguồn mở để chúng tôi chắc chắn có thể tuân thủ, nhưng tôi không có kỹ năng trong bộ phận giấy phép :). Có phải những thứ như phân phối nhị phân có tham chiếu đến nguồn trực tuyến được cho phép hay nguồn phải được bao gồm mọi lúc? –

+0

Bạn cần luật sư. Tôi tin rằng nhị phân-với-tham chiếu được cho phép, miễn là nguồn gốc là có sẵn. Trở ngại lớn nhất là phần mềm của bạn cũng phải là GPL (không phải bất kỳ giấy phép nguồn mở nào khác có khả năng cao hơn). Có một bản sao Bline-copyrighed readline được gọi là editline trong các giai đoạn khác nhau của sự chết. –

Trả lời

4

Sau nỗi thất vọng tương tự, tôi đã chỉ là bây giờ biên soạn cả Phiên bản 32 bit và 64bit của libreadline 6.2 sử dụng MinGW-w64. Dưới đây là tôi làm thế nào tôi đã làm nó:

Layout của dev thư mục của tôi:

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

Đặt một số biến môi trường cho 32 bit build:

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

termcap 1.3.1.
Chạy định cấu hình tập lệnh:

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

Chỉnh sửa termcap.c và sửa một vài dòng ở trên cùng. Mine trông như thế này:

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

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

Sửa đổi 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 

Sau đó gọi make install và nó sẽ biên dịch mà không cảnh báo hoặc lỗi.

readline 6.2
Đặt CPPFLAGS cùng và LDFLAGS biến như với termcap trước khi gọi:

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

Sửa Makefile:

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

make install bây giờ sẽ biên dịch và cài đặt readline !
Nếu bạn muốn có một thư viện 64bit, thay thế i686-w64-mingw32 với * x86_64-w64-mingw32 * và local32 với local64.

+0

Bạn có thể cung cấp thêm một chút thông tin về các hành động của mình không? Tôi đã cố gắng làm theo nó nhưng bị mắc kẹt trên hai vấn đề. Cấu hình termcap đầu tiên bỏ qua đặc tả máy chủ lưu trữ và mặc định để nhắm mục tiêu unix của tôi g ++. Thứ hai, không có tùy chọn trong cấu hình của readline để xác định vị trí của thư viện termcap (hoặc bạn cũng đã chỉnh sửa)? –

+0

Tuyệt vời! Tôi nhận được nó làm việc, sử dụng mingw-w64 crosscompiling từ unix, mà không cần phải thay đổi tập tin termcap! Một mẹo hữu ích: bạn có thể chỉ định các tệp thi hành CC, CXX, AR và RANLIB trong lệnh cấu hình (để bạn có thể rời khỏi makefile không thay đổi) –

0

GnuWin32 có một cảng readline: http://gnuwin32.sourceforge.net/packages/readline.htm

cho các dự án phi GPL, libedit có giấy phép chấp nhận hơn [sử dụng giấy phép BSD]

+0

Tôi đã đề cập rằng tôi không thể nhận được cổng đó để biên dịch dưới mingw? –

+0

cung cấp thêm thông tin chi tiết về nền tảng của bạn. Tôi đã có thể xây dựng nó trên hộp của tôi –

2

Check-out MinGWEditLine library

Một EditLine thực hiện API cho Windows điều khiển bản địa. Thư viện được cấp phép BSD này cung cấp các chức năng chỉnh sửa dòng lệnh và lịch sử tương tự như các hàm được tìm thấy trong GNU Readline.

Chức năng readline chính được triển khai cho bảng điều khiển Windows gốc. Giấy phép BSD.

Các vấn đề liên quan