Вызов динамических библиотек из c-источников не работает в ghci

У меня есть несколько функций C из динамической библиотеки (только zlibVersion здесь), которые я хотел бы вызывать из связанного кода C в пакете клики. Здесь я вызываю его как напрямую как внешний импорт, так и косвенно через связанный код C, чтобы показать, что последний приводит к сбою 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

external_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

cabal-extra-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 — это 7.10.3 с установкой кабалы 1.24.0.0 на OS X 10.11.5. Сборка со стеком и стеком ghci приводит к такому же сбою.


person Wilbur Vandrsmith    schedule 10.06.2016    source источник


Ответы (1)


Это странно. Я мало что знаю об OSX, но dyld: lazy symbol binding failed: Symbol not found: _zlibVersion производит впечатление. Он думает, что OSX является платформой подчеркивания (например, той, где функции C искажены с помощью _).

Это стандартная сборка GHC? а можно попробовать с 8.0.1? многое изменилось в компоновщике.

person Phyx    schedule 26.06.2016
comment
Из вывода nm OS X использует префикс подчеркивания для символов. Сборка 7.10.3 была из стека, который, я думаю, использует официальные сборки GHC. GHC 8.0.1 действительно работает без проблем! - person Wilbur Vandrsmith; 28.06.2016