2013-02-21 16 views
5

Tôi đã thực hiện các liên kết FFI với vùng chứa C++ unordered_map (a.k.a. Hash_map) và thư viện trình bao bọc của nó được gọi là libstl.a. Lần đầu tiên, nó hoạt động tốt. Nhưng sau một thời điểm nào đó, nó đã thất bại trong việc liên kết thư viện với các thông báo lỗi sau và tôi không thể hiểu tại sao.liên kết các thư viện/đối tượng thừa không thành công

$ ghci -L. -lstl -lstdc++ 
GHCi, version 7.6.2: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Loading object (static archive) ./libstl.a ... done 
Loading object (dynamic) /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.so ... done 
final link ... ghc: ./libstl.a: unknown symbol `_ZZNKSt8__detail20_Prime_rehash_policy11_M_next_bktEmE10__fast_bkt' 
linking extra libraries/objects failed 

Mã nguồn cho thư viện nằm ở https://github.com/comatose/stl-container. Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

1

Tôi đã gặp sự cố tương tự khi tải tệp .o vào ghci. Từ những gì tôi hiểu, vấn đề là g ++ để lại 'các ký hiệu yếu' trong các tệp .o và ghci không xử lý chúng rất tốt.

Tôi tìm thấy một chủ đề về nó với một hữu ích theo dõi:

http://www.haskell.org/pipermail/haskell-cafe/2012-March/099926.html

trong đó giải pháp được đề xuất là để đưa mọi thứ biên soạn bởi g ++ vào thư viện chia sẻ (.so file thay vì .a) và điều đó dường như làm sáng tỏ vấn đề biểu tượng yếu. Thư viện được chia sẻ có thể hơi đau. Tôi đề nghị bạn nhìn vào libtool. Đó là một chương trình trợ giúp có thể xử lý rất nhiều các biến chứng:

http://www.gnu.org/software/libtool/

+0

sẽ 'strip'ping các file .o làm việc? – ocramz

+0

Đã lâu rồi tôi mới xem xét điều này. Tôi không nghĩ rằng dải là bất kỳ giúp đỡ, nhưng tôi không chắc chắn 100%. Các phiên bản của GHC 7.8 trở lên dường như có thể tải các thư viện có ký hiệu yếu, vì vậy chúng không có vấn đề này. –

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