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로 빌드하면 동일한 충돌이 발생합니다.
'nm'의 출력물에서, OS X는 기호에 밑줄 접두어를 사용합니다. 7.10.3 빌드는 공식 GHC 빌드를 사용하는 것으로 생각됩니다. GHC 8.0.1이 실제로 문제없이 작동합니다! –