2017-06-22 36 views
0

我想上一個項目,一個模塊有國外來電聯繫到一個C LIB tdsodbc使用ghci中/ stack repl,但我不斷收到ghci中給GHC恐慌調用

ghc: panic! (the 'impossible' happened) 
    (GHC version 7.10.3 for x86_64-unknown-linux): 
    Loading temp shared object failed: /tmp/ghc4628_0/libghc_71.so: undefined symbol: SQLPrepareW 

(其中在那個C lib中定義了SQLPrepareW)。建設與堆棧工作正常。即使在實際調用外部函數的情況下,即使在剛剛導入外部調用模塊的其他模塊上也會發生這種情況。它不會在加載時發生,但只要我嘗試完全評估repl中的任何函數。

我該如何告訴ghci某些函數是在ghc之外的庫中定義的?

我已經試過-l選項(如stack exec ghci -- -ltdsodbc),但隨後的唯一不同的是,從相同的lib不同的功能是錯誤消息:

ghc: panic! (the 'impossible' happened) 
    (GHC version 7.10.3 for x86_64-unknown-linux): 
     Loading temp shared object failed: /tmp/ghc24107_0/libghc_25.so: undefined symbol: SQLDriverConnectW 

注意,這顯然檢查的LIB使用-l時,因爲如果我拼錯了它,它會說,它不能找到它:

$ stack exec ghci -- -L/usr/lib/x86_64-linux-gnu/odbc -ltdsodbctypo 
Warning (added by new or init): Specified resolver could not satisfy all dependencies. Some external packages have been added as dependencies. 
You can suppress this message by removing it from stack.yaml 

GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
<command line>: user specified .o/.so/.DLL could not be loaded (libtdsodbctypo.so: cannot open shared object file: No such file or directory) 
Whilst trying to load: (dynamic) tdsodbctypo 
Additional directories searched: /usr/lib/x86_64-linux-gnu/odbc 

這是

$ stack --version 
Version 1.4.0, Git revision e714f1dd3fade19496d91bd6a017e435a96a6bcd (4640 commits) x86_64 hpack-0.17.0 

我也試過stack ghci --ghci-options '-ltdsodbc -fobject-code',但它也與undefined symbol: SQLPrepareW恐慌。

+0

試試這個https://github.com/commercialhaskell/stack/issues/448 –

+0

啊,看起來很有前途,我以前有一些模塊失蹤'other-modules',但是即使在添加並執行堆棧清理&&堆棧構建&&堆棧ghci後,它仍然會像以前一樣發生混亂: – unhammer

+0

什麼'nm libtdsodbc.so | grep SQLDriverConnectW'顯示? –

回答

0

freenode上#haskell的好人說我也許應該試試把-fobject-code傳給ghci。這沒有用。我嘗試了:set:seti以查看它是否已經設置,但ghci沒有顯示任何關於目標代碼的信息。 (做:unset -fobject-code只給Some flags have not been recognized: -fno-object-code

那麼今天我偶然看我~/.ghci某些其他原因,那確實:set -fobject-code,即使:set/:seti沒有顯示。除去我~/.ghci:set -fobject-code搶走了驚恐發作,我現在可以使用函數從導入國外定義功能:)

實際調用任何的對外職能從ghci中導致段錯誤(catchsegv log的模塊模塊有興趣),但至少我現在可以測試純淨的東西...