SORU
18 Mayıs 2012, Cuma


GHCi zamanı FFI tanımlamalar kullanırken sorun linker

Haskell FFI içinde ve again DZD etkileşimli modu ile ilgili bir sorunum var.

FFISo.hs düşünün:

{-# LANGUAGE OverloadedStrings #-}
module Main where

import qualified Data.ByteString.Char8 as B

import FFIFun.Foo

main :: IO ()
main = do
  B.putStrLn "main"
  callMeFromC
  callMeFromHaskell
  return ()

c.c:

#include <stdio.h>

void callMeFromC(void);

void callMeFromHaskell(void)
{
    printf("callMeFromHaskell\n");
    callMeFromC();
}

FFIFun/Foo.hs:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module FFIFun.Foo where

import qualified Data.ByteString.Char8 as B

foreign import ccall "callMeFromHaskell"
  callMeFromHaskell :: IO ()

foreign export ccall callMeFromC :: IO ()
callMeFromC :: IO ()
callMeFromC = B.putStrLn "callMeFromC"

ve Makefile:

SHELL := bash

GHC_OPT := -Wall -O2 -fno-warn-unused-do-bind


all: ffiso

test: ffiso
    ./$<

ffiso: FFISo.hs c.c
    ghc --make $(GHC_OPT) $^ -o $@

clean:
    rm -rf *{.hi,o,_stub.*} ffiso FFIFun/*{.hi,.o,_stub.*}

ghci: ffiso
    ghci -package bytestring FFIFun/Foo.o c.o FFISo.hs

ayrıca 23 ** bulun.

Yani, benim sorunum şimdi:

$ make ghci
[...]
Ok, modules loaded: Main, FFIFun.Foo.
Prelude Main> -- fine, it's loading.
Prelude Main> :t callMeFromC

<interactive>:1:1: Not in scope: `callMeFromC'
Prelude Main> -- uhm, why?
Prelude Main> :t main
main :: IO ()
Prelude Main> main


GHCi runtime linker: fatal error: I found a duplicate definition for symbol
   FFIFunziFoo_callMeFromC_info
whilst processing object file
   ./FFIFun/Foo.o
This could be caused by:
   * Loading two different object files which export the same symbol
   * Specifying the same object file twice on the GHCi command line
   * An incorrect `package.conf' entry, causing some object to be
     loaded twice.
GHCi cannot safely continue in this situation.  Exiting now.  Sorry.

Hrmpf, burada yanlış olan nedir? İlginçtir i686 (yukarıda x86_64 bir sistem, ama her iki DZD 7.4.1) farklı bir hata alıyorum:

GHCi runtime linker: fatal error: I found a duplicate definition for symbol
   __stginit_FFIFunziFoo
whilst processing object file
   ./FFIFun/Foo.o
This could be caused by:
   * Loading two different object files which export the same symbol
   * Specifying the same object file twice on the GHCi command line
   * An incorrect `package.conf' entry, causing some object to be
     loaded twice.
GHCi cannot safely continue in this situation.  Exiting now.  Sorry.

Ayrıca, bu konuda bazı belgeler var mı? FFI ve GHCi zor zamanlar sadece orada gibi hissediyorum.

edit: make test gayet iyi çalışıyor not:

$ ghc --make -Wall -O2 -fno-warn-unused-do-bind FFISo.hs c.c -o ffiso
[1 of 2] Compiling FFIFun.Foo       ( FFIFun/Foo.hs, FFIFun/Foo.o )
[2 of 2] Compiling Main             ( FFISo.hs, FFISo.o )
Linking ffiso ...
./ffiso
main
callMeFromC
callMeFromHaskell
callMeFromC

CEVAP
16 Ocak 2013, ÇARŞAMBA


Bu dinamik a known limitation bayt kodu yorumlayıcısı, GHCi nesne dosyalarını bağlama.

Eğer size yük derlenmiş kodu olduğunu statik olarak bağlı karşı verilen C nesnesi ve sonra da yorumlamak bazı Haskell anında o da gelir üzerinden FFI aynı C nesnesi, zamanı linker olacak zorla yük C nesne dinamik olarak.

Artık adres alanı C sembolü iki versiyonu var, ve hataları doğmak.

GHCi modu altında her şeyi yorumlamak ya da bu işlem için GHCi kullanarak terk etmelisiniz. Bazı OS bağlayıcılar için dinamik tablo ile statik olarak bağlı sembol tablo (-x bayrak) getirebilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Authority

    Android Auth

    3 NİSAN 2011
  • makemebad35

    makemebad35

    17 NİSAN 2006
  • Rooster Teeth

    Rooster Teet

    11 Temmuz 2006