2016-06-10 62 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确实没有问题! –