2
我從一個動態庫(這裏只是zlibVersion
)有一些C函數,我想從cabal包中的捆綁C代碼調用。在這裏,我將它直接稱爲外部導入,並通過捆綁的C代碼間接地將其稱爲後者,即使在前者成功後,後者也會崩潰ghci。從c-sources調用動態庫失敗ghci
Main.hs:
module Main (main) where
import Foreign.C.String (CString, peekCString)
foreign import ccall "foreign_test" foreignTest :: IO()
foreign import ccall "zlibVersion" zlibVersion :: IO CString
main :: IO()
main = do
zlibVersion >>= peekCString >>= putStrLn
foreignTest
foreign_test.c:
#include <stdio.h>
#include <zlib.h>
void foreign_test() {
puts(zlibVersion());
}
它正常工作,從編譯的二進制:
$ cabal build
$ dist/build/cabal-extra-libs-test/cabal-extra-libs-test
1.2.5
1.2.5
但間接調用崩潰GHCI:
$ cabal repl
Preprocessing executable 'cabal-extra-libs-test' for
cabal-extra-libs-test-0.1.0.0...
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help
[1 of 1] Compiling Main (Main.hs, interpreted)
Ok, modules loaded: Main.
*Main> main
1.2.5
dyld: lazy symbol binding failed: Symbol not found: _zlibVersion
Referenced from: /var/folders/pz/920gzhqn01q8d6vjkvy1yvdr0000gn/T/ghc6850_0/libghc_1.dylib
Expected in: flat namespace
dyld: Symbol not found: _zlibVersion
Referenced from: /var/folders/pz/920gzhqn01q8d6vjkvy1yvdr0000gn/T/ghc6850_0/libghc_1.dylib
Expected in: flat namespace
陰謀,特庫-test.cabal:
name: cabal-extra-libs-test
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.10
executable cabal-extra-libs-test
default-language: Haskell2010
main-is: Main.hs
build-depends: base
c-sources: foreign_test.c
extra-libraries: z
GHC是7.10.3與OS X 10.11.5小集團安裝1.24.0.0。用stack和stack ghci構建同樣的崩潰。
從'nm'的輸出中,OS X在符號上使用下劃線前綴。 7.10.3版本來自堆棧,我認爲它使用官方的GHC版本。 GHC 8.0.1確實沒有問題! –