2014-10-19 29 views
10

Tôi đã có tình hình sau:Giải pháp cho lỗi “Mẫu Haskell + C”?

  • Library X là một wrapper qua một số mã trong C.
  • Library A phụ thuộc vào thư viện X.
  • Library B sử dụng Template Haskell và phụ thuộc vào thư viện A.

GHC bug #9010 không thể cài đặt thư viện B bằng GHC 7.6. Khi TH được xử lý, GHCi cháy lên và cố gắng để tải thư viện X, mà không thành công với một thông báo như

Loading package charsetdetect-ae-1.0 ... linking ... ghc: 
~/.cabal/lib/x86_64-linux-ghc-7.6.3/charsetdetect-ae-1.0/ 
libHScharsetdetect-ae-1.0.a: unknown symbol `_ZTV15nsCharSetProber' 

(tên thực tế của “không rõ biểu tượng” khác với máy để máy).

Có cách giải quyết nào cho vấn đề này (ngoài “không sử dụng mẫu Haskell”, tất nhiên)? Có thể thư viện X đã được biên dịch khác nhau, hoặc có một số cách để ngăn chặn nó tải (vì nó không nên được gọi là trong quá trình tạo mã anyway)?

+0

Thêm 'tùy chọn -lyourlibname' để ghci nơi libyourlibname.so là liệu pháp quấn thư viện X. –

+0

@ n.m. Không có 'libyourlibname.so' - tất cả mã được gói bởi thư viện X được chứa trong thư viện X. – Artyom

+0

Hm, có vẻ như bạn đã đúng. Biểu tượng không xác định, không được xác định. –

Trả lời

4

Đây thực sự là một trong những lý do chính khiến 7.8 chuyển sang GHCi động theo mặc định. Thay vì cố gắng hỗ trợ mọi tính năng của mọi định dạng tệp đối tượng, nó xây dựng thư viện động và cho phép trình tải động hệ thống xử lý chúng.

Thử xây dựng với tùy chọn g ++ -fno-weak. Từ trang man g ++:

-fno-yếu

Không sử dụng hỗ trợ biểu tượng yếu, ngay cả khi nó được cung cấp bởi các mối liên kết. Theo mặc định, G ++ sẽ sử dụng các ký hiệu yếu nếu chúng có sẵn. Tùy chọn này chỉ tồn tại để thử nghiệm và không nên được sử dụng bởi người dùng cuối; nó sẽ dẫn đến mã thấp hơn và không có lợi ích. Tùy chọn này có thể bị xóa trong bản phát hành G + trong tương lai.

Có vấn đề khác với __dso_handle. Tôi thấy rằng bạn có thể ít nhất có được thư viện để tải và dường như làm việc bằng cách liên kết trong một tập tin định nghĩa biểu tượng đó. Tôi không biết liệu vụ hack này có gây ra lỗi gì không.

Vì vậy, trong X.cabal thêm

if impl(ghc < 7.8) 
    cc-option: -fno-weak 
    c-sources: cbits/dso_handle.c 

nơi cbits/dso_handle.c chứa

void *__dso_handle; 
Các vấn đề liên quan