2016-06-10 61 views
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構建同樣的崩潰。

回答

1

這是奇特的..我對OSX瞭解不多,但dyld: lazy symbol binding failed: Symbol not found: _zlibVersion給人的印象它認爲OSX是一個下劃線平臺(例如,一個C函數與_有衝突的地方)。

這是一個標準的GHC構建?你可以試試8.0.1?鏈接器中的很多內容已經更改。

+0

從'nm'的輸出中,OS X在符號上使用下劃線前綴。 7.10.3版本來自堆棧,我認爲它使用官方的GHC版本。 GHC 8.0.1確實沒有問題! –