2016-06-10 6 views
2

cabal 패키지의 번들 C 코드에서 호출하고 싶은 동적 라이브러리 (여기서는 zlibVersion)의 일부 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 

음모-추가-libs와-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는 OS X 10.11.5에 1.24.0.0을 음모 설치와 7.10.3입니다. 스택 및 스택 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이 실제로 문제없이 작동합니다! –