2016-06-10 2 views
2

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

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 

Cabal-экстра-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 приводит к тому же сбою.

ответ

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 действительно работает без проблем! –

Смежные вопросы