我正在尝试在一个项目中使用ghci / stack repl
,其中一个模块将外部调用链接到C lib tdsodbc
,但我一直在
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
(其中SQLPrepareW
在C lib中定义)。使用堆栈构建工作正常。即使在没有实际调用外部函数的情况下,即使在刚刚发生导入外部调用模块的其他模块上也会发生这种情况。它不会在加载时发生,但只要我尝试完全评估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
请注意,使用-l
时显然正在检查lib,因为如果我拼错它,它会说它无法找到它:
$ 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 :(得分: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
/ {{1}没有表明。从我的:seti
删除:set -fobject-code
消除了恐慌攻击,我现在可以使用导入定义外部函数的模块的模块中的函数:)
实际上从ghci调用任何外来函数会导致段错误(感兴趣的catchsegv log),但至少我现在可以测试纯粹的东西......