2013-02-21 14 views
5

Ho creato collegamenti FFI al contenitore C++ unordered_map (a.k.a. Hash_map) e alla relativa libreria wrapper denominata libstl.a. Per la prima volta, funzionava bene. Ma dopo un certo punto, non è riuscito a collegare la libreria con i seguenti messaggi di errore e non riesco a capire perché.collegamento librerie/oggetti aggiuntivi non riusciti

$ 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 

I codici sorgente per la libreria si trovano in https://github.com/comatose/stl-container. Qualsiasi aiuto sarà apprezzato.

risposta

1

Ho avuto problemi simili durante il caricamento di file .o in ghci. Da quello che ho capito, il problema è che g ++ lascia 'i simboli deboli' nei file .o, e ghci non li tratta molto bene.

Ho trovato un thread su di esso con un utile di follow-up:

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

in cui la soluzione suggerita è di mettere tutto compilato da g ++ in librerie condivise (.so file invece di .a) e questo sembra chiarire il problema dei simboli deboli. Le librerie condivise possono essere un po 'dolorose. Suggerisco di guardare a libtool. Si tratta di un programma di aiuto in grado di gestire un sacco di complicazioni:

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

+0

sarebbe 'strip'ping i file .o lavorare? – ocramz

+0

È passato un po 'di tempo da quando ho guardato questo. Non credo che la strip sia stata d'aiuto, ma non ne sono sicuro al 100%. Le versioni di GHC 7.8 e successive sembrano essere in grado di caricare librerie con simboli deboli, quindi non hanno questo problema. –

Problemi correlati