2017-06-22 158 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的模块模块有兴趣),但至少我现在可以测试纯净的东西...