[Programming] Hỏi xin mingw gcc4 dw2 |
06/08/2007 09:57:50 (+0700) | #1 | 77141 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
Alice có một ít source c++ cần compile và link với một thư viện binary lớn(không có source) tạo sẵn bằng mingw gcc g++.
Đã thử bản 3.4.5 sjlj (bản chính thức, sourceforge) -- không dùng được.
Đã thử bản 4.1.2 sjlj (bản không chính thức) -- cũng không dùng được.
Đã thử bản 3.4.5 dw2 (bản chính thức, sourceforge) -- cũng không dùng được luôn.
Bây giờ alice muốn kiếm bản 4.1.2 dw2 hoặc cao hơn để thử. Ai có bản này vui lòng cho alice xin địa chỉ download binary, source hoặc hướng dẫn cách patch+build từ một bản có sẵn nào đấy. )
Alice cám ơn. |
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|
|
[Question] Hỏi xin mingw gcc4 dw2 |
06/08/2007 18:00:31 (+0700) | #2 | 77213 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
alice wrote:
Alice có một ít source c++ cần compile và link với một thư viện binary lớn(không có source) tạo sẵn bằng mingw gcc g++.
Đã thử bản 3.4.5 sjlj (bản chính thức, sourceforge) -- không dùng được.
Đã thử bản 4.1.2 sjlj (bản không chính thức) -- cũng không dùng được.
Đã thử bản 3.4.5 dw2 (bản chính thức, sourceforge) -- cũng không dùng được luôn.
Bây giờ alice muốn kiếm bản 4.1.2 dw2 hoặc cao hơn để thử. Ai có bản này vui lòng cho alice xin địa chỉ download binary, source hoặc hướng dẫn cách patch+build từ một bản có sẵn nào đấy. )
Alice cám ơn.
Nó báo những lỗi cụ thể thế nào khi compile vậy Alice? Chưa hẳn bản 4.1.2 dw2 có thể khắc phục sự cố đâu. |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] Hỏi xin mingw gcc4 dw2 |
07/08/2007 07:25:32 (+0700) | #3 | 77397 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
conmale wrote:
Nó báo những lỗi cụ thể thế nào khi compile vậy Alice? Chưa hẳn bản 4.1.2 dw2 có thể khắc phục sự cố đâu.
Dạ. Nhưng alice hi vọng gcc4 dw2 là cách nhẹ nhàng nhất, giúp giải quyết sự cố mà không phải "nhào vô" tìm nguyên nhân và bản chất sâu xa của sự cố. Với các bản gcc kia, khi compile+link không báo lỗi, nhưng khi run có thể trục trặc về exeption handling (EH) -1-. Tình hình tóm tắt như sau.
Background
Alpha là thư viện được cung cấp dưới dạng .a và .dll binary, viết bằng C++, no source ngoại trừ spec trong các .h files.
AlphaBinding là thư viện được cung cấp mà alice muốn compile thành .a và .dll, viết một phần bằng C++ nhưng có .h files bằng C, còn phần kia bằng ngôn ngữ khác (tạm gọi là Lang), dùng Alpha. (Chuyện này possible vì Lang semantics chứa interface với C, theo đó .h files có thể được "dịch" từ C (thuần) sang Lang.)
Bravo là user program, viết bằng Lang, dùng Alpha thông qua Alpha Binding. Alpha được dùng như một application framework, nghĩa là không những Bravo gọi Alpha (Binding) mà Alpha cũng có thể gọi Bravo qua callback handlers mà Bravo đăng ký với Alpha (Binding):
Alpha <------> AlphaBinding <-------> Bravo
(Một phần AlphaBinding chỉ thay thế cho .h spec của Alpha, nên không sinh object code, khi đó lời gọi Bravo --> Alpha thực tế là trực tiếp. Phần còn lại của AlphaBinding gồm một số hàm làm vỏ bọc cho hàm tương ứng của Alpha, khi đó lời gọi Bravo --> Alpha là gián tiếp.)
Ideas
Lý tưởng nhất, bộ ba Alpha + AlphaBinding + Bravo nên dùng chung một (shared, dynamically linked) run-time lib. Ít ra, để đảm bảo cross-lib EH, chúng nên dùng chung (share) EH lib. Nhưng lib nào?
Alpha run-time lib chứa mingw run-time lib -2-. Alpha và (statically linked) run-time lib của nó không chứa EH lib và cũng không gọi tới EH lib -2- nên có lẽ không chứa bất cứ lệnh throw, catch nào cả. Vì vậy không cần phải tính đến Alpha.
Bravo (default) run-time lib được cung cấp bởi Lang IDE, chứa mingw run-time lib tạo bởi mingw-targeted gcc 4.1.3. (Thật ra, bản thân các công cụ chính của Lang IDE như gcc.exe, ld.exe,... cũng thuộc gcc 4.1.3.) Nhưng lib này không dùng low-cost EH (sjlj) vốn dĩ ổn định và có sẵn ở bản mingw thông thường, mà dùng zero-cost EH (dw2). Chuyện đổi run-time lib cho Bravo là impossible -- nhiều cấu trúc intrinsic của ngôn ngữ Lang được biên dịch thành lời gọi hàm C, muốn đổi run-time lib, chắc chắn phải hack Lang compiler. alice bó tay.
Vì vậy, lib cần dùng phải là lib của Lang IDE.
Problem
Nhẽ ra, sẽ đơn giản nếu Lang IDE cung cấp luôn g++ 4.1.3 dw2, tức C++ compiler cùng bộ với C compiler đã dùng để tạo ra Lang run-time libs. Đáng tiếc, bản Lang IDE mà alice có không chứa compiler này. Vì thế để dịch phần C++ của Bravo, alice đã cài đặt thêm mingw core và g++, nhưng... riêng biệt. Môi trường này, gọi là mingw bis, kể cả thư mục include và lib, đều riêng biệt, hoàn toàn không dính líu đến Lang IDE's mingw (.
Còn compile và link, alice đã làm thế này:
AlphaBinding được (1) compile trong mingw bis, dùng g++ của mingw bis và Lang compiler của Lang IDE, (2) link thành AlphaBinding .a và .dll, (3) install trong môi trường Lang IDE.
Bravo được (4) compile trong Lang IDE, (5) link với AlphaBinding.a và (6) run với AlphaBinding.dll.
Về điểm (2). Với bản mingw 3.4.5 dw2 mà alice đã thử cài đặt, tình trạng là:
(i) Nếu link (statically) với mingw bis EH lib, bước (6) chương trình "có vẻ chạy" nhưng chắc chắn sẽ chạy bậy bạ. Thí dụ, exeption thrown từ AlphaBinding không thể catch ở Bravo.
(ii) Nếu link (dynamically) với Lang IDE's mingw EH lib, ở bước (6) sẽ gặp segmentation fault. Dễ hiểu: include của mingw bis, lib của Lang IDE. "Đầu một nơi, mình một nẻo" như thế, chết là phải. )
Còn với các bản mingw 3.4.5 và 4.1.2 sjlj mà alice đã thử cài đặt, chỉ có thể link theo (i). Khi đó chương trình "có vẻ chạy" nhưng lấy gì đảm bảo nó không chạy bậy khi AlphaBinding và Bravo dùng 2 cơ chế EH khác nhau như thế?
Solution
Tạm thời alice nghĩ là có 3 hướng giải quyết.
(a) "Đế đạo", tích hợp g++ 4.1.3 dw2 vào Lang IDE's mingw, including includes & libs.
(b) "Vương đạo", cài g++ 4.1.3 (hoặc ít ra, 4.1.2) dw2 riêng rẽ, rồi config để nó dùng includes và libs của Lang IDE, chỉ includes và libs nào mà Lang IDE không cung cấp thì mới dùng bản tương ứng của nó.
(c) Hoặc "bá đạo", cài g++ 4.1.3 (4.1.2) dw2 hoàn toàn riêng rẽ, compile với includes của nó, link với libs của Lang IDE. Chấp nhận "đầu một nơi, mình một nẻo" và hi vọng cái "mình" này chạy được với cái "đầu" kia. )
Có tích hợp hay không còn tính sau. Trước hết phải kiếm ra (hay có lẽ đúng hơn, chế ra) nó cái đã. Nhưng làm cách nào? Eo ơi, khó lắm. (
-----------------------------------
-1- Phỏng đoán, chỉ là lý thuyết.
-2- Phỏng đoán, nhờ binary dump. |
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|
|
[Question] Hỏi xin mingw gcc4 dw2 |
07/08/2007 09:51:06 (+0700) | #4 | 77426 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
alice wrote:
conmale wrote:
Nó báo những lỗi cụ thể thế nào khi compile vậy Alice? Chưa hẳn bản 4.1.2 dw2 có thể khắc phục sự cố đâu.
Dạ. Nhưng alice hi vọng gcc4 dw2 là cách nhẹ nhàng nhất, giúp giải quyết sự cố mà không phải "nhào vô" tìm nguyên nhân và bản chất sâu xa của sự cố. Với các bản gcc kia, khi compile+link không báo lỗi, nhưng khi run có thể trục trặc về exeption handling (EH) -1-. Tình hình tóm tắt như sau.
Alice đã verify tình trạng "có thể" chưa?
alice wrote:
Background
Alpha là thư viện được cung cấp dưới dạng .a và .dll binary, viết bằng C++, no source ngoại trừ spec trong các .h files.
AlphaBinding là thư viện được cung cấp mà alice muốn compile thành .a và .dll, viết một phần bằng C++ nhưng có .h files bằng C, còn phần kia bằng ngôn ngữ khác (tạm gọi là Lang), dùng Alpha. (Chuyện này possible vì Lang semantics chứa interface với C, theo đó .h files có thể được "dịch" từ C (thuần) sang Lang.)
Bravo là user program, viết bằng Lang, dùng Alpha thông qua Alpha Binding. Alpha được dùng như một application framework, nghĩa là không những Bravo gọi Alpha (Binding) mà Alpha cũng có thể gọi Bravo qua callback handlers mà Bravo đăng ký với Alpha (Binding):
Alpha <------> AlphaBinding <-------> Bravo
Vậy nếu hiểu đúng thì AlphaBinding là "wrapper" của Alpha mà Bravo có thể dùng được. Đúng không nhỉ?
alice wrote:
(Một phần AlphaBinding chỉ thay thế cho .h spec của Alpha, nên không sinh object code, khi đó lời gọi Bravo --> Alpha thực tế là trực tiếp. Phần còn lại của AlphaBinding gồm một số hàm làm vỏ bọc cho hàm tương ứng của Alpha, khi đó lời gọi Bravo --> Alpha là gián tiếp.)
Ái chà... cái này hơi căng vì một phần Bravo gọi Alpha trực tiếp, một phần phải qua cái wrapper? Nếu vậy trong quá trình link và compile, mình phải làm sao để tách rời chúng một cách rạch ròi? Đó là chưa kể những mix up @ runtime thì đúng là đau đầu. (
alice wrote:
Ideas
Lý tưởng nhất, bộ ba Alpha + AlphaBinding + Bravo nên dùng chung một (shared, dynamically linked) run-time lib. Ít ra, để đảm bảo cross-lib EH, chúng nên dùng chung (share) EH lib. Nhưng lib nào?
Chịu chết.
alice wrote:
Alpha run-time lib chứa mingw run-time lib -2-. Alpha và (statically linked) run-time lib của nó không chứa EH lib và cũng không gọi tới EH lib -2- nên có lẽ không chứa bất cứ lệnh throw, catch nào cả. Vì vậy không cần phải tính đến Alpha.
Nếu vậy gọi trực tiếp đến Alpha cho Bravo (như ở trên) rơi vào đâu?
alice wrote:
Bravo (default) run-time lib được cung cấp bởi Lang IDE, chứa mingw run-time lib tạo bởi mingw-targeted gcc 4.1.3. (Thật ra, bản thân các công cụ chính của Lang IDE như gcc.exe, ld.exe,... cũng thuộc gcc 4.1.3.) Nhưng lib này không dùng low-cost EH (sjlj) vốn dĩ ổn định và có sẵn ở bản mingw thông thường, mà dùng zero-cost EH (dw2). Chuyện đổi run-time lib cho Bravo là impossible -- nhiều cấu trúc intrinsic của ngôn ngữ Lang được biên dịch thành lời gọi hàm C, muốn đổi run-time lib, chắc chắn phải hack Lang compiler. alice bó tay.
Vì vậy, lib cần dùng phải là lib của Lang IDE.
Provider của Lang IDE không thể cung cấp dw2 sao? Lý do tại sao nó phải dùng zero-cost EH?
alice wrote:
Problem
Nhẽ ra, sẽ đơn giản nếu Lang IDE cung cấp luôn g++ 4.1.3 dw2, tức C++ compiler cùng bộ với C compiler đã dùng để tạo ra Lang run-time libs. Đáng tiếc, bản Lang IDE mà alice có không chứa compiler này. Vì thế để dịch phần C++ của Bravo, alice đã cài đặt thêm mingw core và g++, nhưng... riêng biệt. Môi trường này, gọi là mingw bis, kể cả thư mục include và lib, đều riêng biệt, hoàn toàn không dính líu đến Lang IDE's mingw (.
Ùm... đoạn này trả lời cho thắc mắc ở trên.
alice wrote:
Còn compile và link, alice đã làm thế này:
AlphaBinding được (1) compile trong mingw bis, dùng g++ của mingw bis và Lang compiler của Lang IDE, (2) link thành AlphaBinding .a và .dll, (3) install trong môi trường Lang IDE.
Từ 2 libs khác nhau? Cái này sẽ có những phản ứng không lường trước được.
alice wrote:
Bravo được (4) compile trong Lang IDE, (5) link với AlphaBinding.a và (6) run với AlphaBinding.dll.
Và nó works?
alice wrote:
Về điểm (2). Với bản mingw 3.4.5 dw2 mà alice đã thử cài đặt, tình trạng là:
(i) Nếu link (statically) với mingw bis EH lib, bước (6) chương trình "có vẻ chạy" nhưng chắc chắn sẽ chạy bậy bạ. Thí dụ, exeption thrown từ AlphaBinding không thể catch ở Bravo.
Hẳn nhiên là thế rồi.
alice wrote:
(ii) Nếu link (dynamically) với Lang IDE's mingw EH lib, ở bước (6) sẽ gặp segmentation fault. Dễ hiểu: include của mingw bis, lib của Lang IDE. "Đầu một nơi, mình một nẻo" như thế, chết là phải. )
Khì khì, y như điều anh thắc mắc ở trên.
alice wrote:
Còn với các bản mingw 3.4.5 và 4.1.2 sjlj mà alice đã thử cài đặt, chỉ có thể link theo (i). Khi đó chương trình "có vẻ chạy" nhưng lấy gì đảm bảo nó không chạy bậy khi AlphaBinding và Bravo dùng 2 cơ chế EH khác nhau như thế?
Không có gì bảo đảm cả.
alice wrote:
Solution
Tạm thời alice nghĩ là có 3 hướng giải quyết.
(a) "Đế đạo", tích hợp g++ 4.1.3 dw2 vào Lang IDE's mingw, including includes & libs.
(b) "Vương đạo", cài g++ 4.1.3 (hoặc ít ra, 4.1.2) dw2 riêng rẽ, rồi config để nó dùng includes và libs của Lang IDE, chỉ includes và libs nào mà Lang IDE không cung cấp thì mới dùng bản tương ứng của nó.
(c) Hoặc "bá đạo", cài g++ 4.1.3 (4.1.2) dw2 hoàn toàn riêng rẽ, compile với includes của nó, link với libs của Lang IDE. Chấp nhận "đầu một nơi, mình một nẻo" và hi vọng cái "mình" này chạy được với cái "đầu" kia. )
Có tích hợp hay không còn tính sau. Trước hết phải kiếm ra (hay có lẽ đúng hơn, chế ra) nó cái đã. Nhưng làm cách nào? Eo ơi, khó lắm. (
-----------------------------------
-1- Phỏng đoán, chỉ là lý thuyết.
-2- Phỏng đoán, nhờ binary dump.
Thử tìm lung tung mà không thấy có g++ 4.1.3 dw2.
Alice đụng một trường hợp rất căng và rất hiếm hoi. Không thấy một giải pháp nào clean và bảo đảm ngoài giải pháp có Lang IDE cung cấp luôn g++ 4.1.3 dw2 (.
Thân mến. |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] Hỏi xin mingw gcc4 dw2 |
07/08/2007 12:41:07 (+0700) | #5 | 77480 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
conmale wrote:
alice wrote:
conmale wrote:
Nó báo những lỗi cụ thể thế nào khi compile vậy Alice? Chưa hẳn bản 4.1.2 dw2 có thể khắc phục sự cố đâu.
Dạ. Nhưng alice hi vọng gcc4 dw2 là cách nhẹ nhàng nhất, giúp giải quyết sự cố mà không phải "nhào vô" tìm nguyên nhân và bản chất sâu xa của sự cố. Với các bản gcc kia, khi compile+link không báo lỗi, nhưng khi run có thể trục trặc về exeption handling (EH) -1-. Tình hình tóm tắt như sau.
Alice đã verify tình trạng "có thể" chưa?
Tạm thời chưa. Vì còn những trục trặc khác có lẽ không liên quan đến EH. Thí dụ, khi đóng cửa sổ, chương trình không thể terminate và CPU load tăng vọt lên đến 100% của 1 core. (CPU là multi-core, nhưng chương trình chỉ dùng 1 core.)
conmale wrote:
alice wrote:
Background
Alpha là thư viện được cung cấp dưới dạng .a và .dll binary, viết bằng C++, no source ngoại trừ spec trong các .h files.
AlphaBinding là thư viện được cung cấp mà alice muốn compile thành .a và .dll, viết một phần bằng C++ nhưng có .h files bằng C, còn phần kia bằng ngôn ngữ khác (tạm gọi là Lang), dùng Alpha. (Chuyện này possible vì Lang semantics chứa interface với C, theo đó .h files có thể được "dịch" từ C (thuần) sang Lang.)
Bravo là user program, viết bằng Lang, dùng Alpha thông qua Alpha Binding. Alpha được dùng như một application framework, nghĩa là không những Bravo gọi Alpha (Binding) mà Alpha cũng có thể gọi Bravo qua callback handlers mà Bravo đăng ký với Alpha (Binding):
Alpha <------> AlphaBinding <-------> Bravo
Vậy nếu hiểu đúng thì AlphaBinding là "wrapper" của Alpha mà Bravo có thể dùng được. Đúng không nhỉ?
Vâng, đúng thế. "Binding" là thuật ngữ người dùng Lang chỉ "wrapper" bao bọc thư viện viết bằng ngôn ngữ khác.
conmale wrote:
alice wrote:
(Một phần AlphaBinding chỉ thay thế cho .h spec của Alpha, nên không sinh object code, khi đó lời gọi Bravo --> Alpha thực tế là trực tiếp. Phần còn lại của AlphaBinding gồm một số hàm làm vỏ bọc cho hàm tương ứng của Alpha, khi đó lời gọi Bravo --> Alpha là gián tiếp.)
Ái chà... cái này hơi căng vì một phần Bravo gọi Alpha trực tiếp, một phần phải qua cái wrapper? Nếu vậy trong quá trình link và compile, mình phải làm sao để tách rời chúng một cách rạch ròi? Đó là chưa kể những mix up @ runtime thì đúng là đau đầu. (
Không cần phải tách rời chúng một cách rạch ròi. Về nguyên tắc, Bravo viết bằng Lang nên không thể gọi thẳng Alpha (C++) mà bắt buộc phải gọi AlphaBinding, nhưng hàm Binding nào map thẳng vào Alpha thì cho phép gọi trực tiếp thôi. Hàm map thẳng vẫn phải compile như bình thường, và thực ra, chúng rất ít, chừng 1 % của Binding.
conmale wrote:
alice wrote:
Ideas
Lý tưởng nhất, bộ ba Alpha + AlphaBinding + Bravo nên dùng chung một (shared, dynamically linked) run-time lib. Ít ra, để đảm bảo cross-lib EH, chúng nên dùng chung (share) EH lib. Nhưng lib nào?
Chịu chết.
alice wrote:
Alpha run-time lib chứa mingw run-time lib -2-. Alpha và (statically linked) run-time lib của nó không chứa EH lib và cũng không gọi tới EH lib -2- nên có lẽ không chứa bất cứ lệnh throw, catch nào cả. Vì vậy không cần phải tính đến Alpha.
Nếu vậy gọi trực tiếp đến Alpha cho Bravo (như ở trên) rơi vào đâu?
Alice chưa hiểu câu hỏi này của anh. Khi Bravo gọi Alpha trực tiếp, AlphaBinding không tham gia và giả sử Alpha không throw/catch gì, như phỏng đoán ở trên, thì sẽ không có chuyện gì xảy ra. Chỉ phức tạp khi Bravo gọi Alpha gián tiếp qua AlphaBinding:
Bravo --> AlphaBinding --> Alpha
Do một lỗi nào đó của Alpha (báo bằng return value...), bản thân AlphaBinding có thể throw exception (explicitly bằng lệnh throw hoặc implicitly bằng compiler-generated code) và exception này cần được catch ở Bravo.
Còn các trường hợp call chain rất dài dòng và xuyên qua Alpha, AlphaBinding, Bravo nhiều lần nhưng điểm đầu (throw) và điểm cuối (catch) ở trong cùng một module thì không biết liệu 2 cơ chế EH khác nhau có ảnh hưởng gì lẫn nhau không. Nếu không thì trường hợp này ổn. Tuy nhiên, muốn chắc ăn thì ngay cả trong trường hợp này cũng chỉ nên dùng 1 cơ chế thôi.
conmale wrote:
alice wrote:
Bravo (default) run-time lib được cung cấp bởi Lang IDE, chứa mingw run-time lib tạo bởi mingw-targeted gcc 4.1.3. (Thật ra, bản thân các công cụ chính của Lang IDE như gcc.exe, ld.exe,... cũng thuộc gcc 4.1.3.) Nhưng lib này không dùng low-cost EH (sjlj) vốn dĩ ổn định và có sẵn ở bản mingw thông thường, mà dùng zero-cost EH (dw2). Chuyện đổi run-time lib cho Bravo là impossible -- nhiều cấu trúc intrinsic của ngôn ngữ Lang được biên dịch thành lời gọi hàm C, muốn đổi run-time lib, chắc chắn phải hack Lang compiler. alice bó tay.
Vì vậy, lib cần dùng phải là lib của Lang IDE.
Provider của Lang IDE không thể cung cấp dw2 sao? Lý do tại sao nó phải dùng zero-cost EH?
alice wrote:
Problem
Nhẽ ra, sẽ đơn giản nếu Lang IDE cung cấp luôn g++ 4.1.3 dw2, tức C++ compiler cùng bộ với C compiler đã dùng để tạo ra Lang run-time libs. Đáng tiếc, bản Lang IDE mà alice có không chứa compiler này. Vì thế để dịch phần C++ của Bravo, alice đã cài đặt thêm mingw core và g++, nhưng... riêng biệt. Môi trường này, gọi là mingw bis, kể cả thư mục include và lib, đều riêng biệt, hoàn toàn không dính líu đến Lang IDE's mingw (.
Ùm... đoạn này trả lời cho thắc mắc ở trên.
Provider của Lang IDE cung cấp dw2 run-time, mà nó gọi là zero-cost. Run-time này tương thích với C++ theo nghĩa object code sinh bởi g++ và object code sinh bởi Lang compiler có thể throw và catch exception lẫn nhau. Optionally, nó cung cấp cả sjlj. Nhưng sjlj chỉ được xem là "low-cost", nghĩa là dù hơn đứt Micro$oft SEH nhưng vẫn kém "zero-cost". Vả lại, sjlj này không giống và không hoàn toàn tương thích với sjlj của C++.
conmale wrote:
alice wrote:
Còn compile và link, alice đã làm thế này:
AlphaBinding được (1) compile trong mingw bis, dùng g++ của mingw bis và Lang compiler của Lang IDE, (2) link thành AlphaBinding .a và .dll, (3) install trong môi trường Lang IDE.
Từ 2 libs khác nhau? Cái này sẽ có những phản ứng không lường trước được.
Ở đoạn này, chưa thể nói có vấn đề gì hay không. Bước (1), chỉ phần viết bằng C++ được compile bằng g++, dùng includes của mingw bis, còn phần viết bằng Lang thì được compile bằng Lang compiler, dùng Lang-includes và C-includes của Lang IDE. Bước (3), bình thường. Mấu chốt chỉ ở bước (2) mà alice chưa nói chi tiết ở đoạn này.
conmale wrote:
alice wrote:
Bravo được (4) compile trong Lang IDE, (5) link với AlphaBinding.a và (6) run với AlphaBinding.dll.
Và nó works?
Vẫn như đoạn trên, ở đoạn này chưa thể nói works hay không. Các bước (4), (5), (6) là qui trình bình thường. Nó có thể work, nếu làm tốt bước (2).
conmale wrote:
alice wrote:
Về điểm (2). Với bản mingw 3.4.5 dw2 mà alice đã thử cài đặt, tình trạng là:
(i) Nếu link (statically) với mingw bis EH lib, bước (6) chương trình "có vẻ chạy" nhưng chắc chắn sẽ chạy bậy bạ. Thí dụ, exeption thrown từ AlphaBinding không thể catch ở Bravo.
Hẳn nhiên là thế rồi.
alice wrote:
(ii) Nếu link (dynamically) với Lang IDE's mingw EH lib, ở bước (6) sẽ gặp segmentation fault. Dễ hiểu: include của mingw bis, lib của Lang IDE. "Đầu một nơi, mình một nẻo" như thế, chết là phải. )
Khì khì, y như điều anh thắc mắc ở trên.
Anh thấy đó, bước (2) alice làm không tốt. Hic hic. (
conmale wrote:
alice wrote:
Solution
Tạm thời alice nghĩ là có 3 hướng giải quyết.
(a) "Đế đạo", tích hợp g++ 4.1.3 dw2 vào Lang IDE's mingw, including includes & libs.
(b) "Vương đạo", cài g++ 4.1.3 (hoặc ít ra, 4.1.2) dw2 riêng rẽ, rồi config để nó dùng includes và libs của Lang IDE, chỉ includes và libs nào mà Lang IDE không cung cấp thì mới dùng bản tương ứng của nó.
(c) Hoặc "bá đạo", cài g++ 4.1.3 (4.1.2) dw2 hoàn toàn riêng rẽ, compile với includes của nó, link với libs của Lang IDE. Chấp nhận "đầu một nơi, mình một nẻo" và hi vọng cái "mình" này chạy được với cái "đầu" kia. )
Có tích hợp hay không còn tính sau. Trước hết phải kiếm ra (hay có lẽ đúng hơn, chế ra) nó cái đã. Nhưng làm cách nào? Eo ơi, khó lắm. (
-----------------------------------
-1- Phỏng đoán, chỉ là lý thuyết.
-2- Phỏng đoán, nhờ binary dump.
Thử tìm lung tung mà không thấy có g++ 4.1.3 dw2.
Alice đụng một trường hợp rất căng và rất hiếm hoi. Không thấy một giải pháp nào clean và bảo đảm ngoài giải pháp có Lang IDE cung cấp luôn g++ 4.1.3 dw2 (.
Thân mến.
Cám ơn anh. Mới đầu Alice tưởng dễ, nhưng càng tiếp xúc với vấn đề càng thấy khó, đến mức vô vọng. ( |
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|
|
[Question] Hỏi xin mingw gcc4 dw2 |
07/08/2007 14:55:50 (+0700) | #6 | 77508 |
rcrackvn
Elite Member
|
0 |
|
|
Joined: 27/03/2007 02:04:05
Messages: 42
Offline
|
|
mingw dw2 patch post trên gnu-patches tháng 05/07. Tui không có mingw nên không test, hope it works for you.
http://gcc.gnu.org/ml/gcc-patches/2007-05/msg02051.html |
|
|
|
|
[Question] Hỏi xin mingw gcc4 dw2 |
08/08/2007 10:32:31 (+0700) | #7 | 77728 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
rcrackvn wrote:
mingw dw2 patch post trên gnu-patches tháng 05/07. Tui không có mingw nên không test, hope it works for you.
http://gcc.gnu.org/ml/gcc-patches/2007-05/msg02051.html
Thank you, rcrackvn. Alice sẽ thử apply patch vào bản 4.2.1. |
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|
|
[Question] Re: Hỏi xin mingw gcc4 dw2 |
11/08/2007 10:27:14 (+0700) | #8 | 78382 |
|
alice
Elite Member
|
0 |
|
|
Joined: 20/01/2005 22:23:24
Messages: 87
Location: Wonderland
Offline
|
|
Ơn Chúa! Cuối cùng thì Danny Smith -- người quản lý dự án mingw -- cũng đã phát hành bản 4.2.1 (core, C++, Ada, Fortran) sjlj và dw2 sau gần 2 năm mọi người mỏi mòn trông đợi. Và may ơi là may, vào đúng lúc mà alice đang cần! )
Bản dw2 cố nhiên tích hợp cả patch tháng 05/2007 mà rcrackvn đã nói trên -- patch này cũng thuộc về Danny. Với bản mới này, cross-function optimization và zero-cost exception handling, những thứ hàng xa xỉ mà từ trước đến giờ chỉ người dùng Linux mới có cũng đã được mang đến cho những "công dân hạng nhì" của thế giới gcc -- người dùng Windows.
Giờ alice sẽ thử dùng g++ 4.2.1 dw2 kết hợp với gcc 4.1.3 dw2 từ Lang IDE. Bản 4.1.3 là một branch đặc biệt phát triển từ 4.1 với gần 1 MB patch. Trong đó, một số patch chỉ mới được đưa vào bản 4.2, 4.3 và đa số thậm chí chưa submitted -- gồm các patch liên quan đến Windows, do thái độ thận trọng của FSF đối với Micro$oft.
Dù kết quả sẽ thế nào, alice vẫn cảm ơn Danny. ) |
|
Như hà nghịch lỗ lai xâm phạm
如 何 逆 虜 來 侵 犯 |
|
|