2016-01-10 13 views
9

Jest to prawdopodobnie duplikat this post. Ale jedyna uzyskana odpowiedź nie działa dla mnie, więc zamieszczam tutaj moją własną sprawę, mając nadzieję na znalezienie konkretnego rozwiązania. Jestem na Linux Ubuntu Trusty.Haskell Stack and C Libraries

Posiadam zastrzeżoną bibliotekę C, libMyLib.so, zlokalizowaną w/usr/local/lib (która jest zawarta w LD_LIBRARY_PATH).

Napisałem powiązania haskellowe do tej biblioteki C w sposób zwyczajny. Main.hs:

{-# LANGUAGE ForeignFunctionInterface #-} 

module Main where 

import Foreign 
import Foreign.C.Types 

foreign import ccall safe "mycfunction" c_myCfunction :: CInt -> IO (CInt) 
-- etc... 

main = do -- ... 

mogę przetestować ten program z ghci, przekazując jej bibliotekę i katalog, w którym może go znaleźć: ghci /usr/local/lib/ -lMyLib i to działa dobrze.

Teraz, niezależnie, próbuję zacząć używać stosu, a po this guide udało mi się zbudować kilka nietrywialnych przykładów programów.

Jednak nie jestem w stanie układać-zbudować program FFI Main.hs powyżej, ponieważ narzeka na brakujące biblioteki C:

najpierw spróbować:
[email protected]:~/myProject$ stack build

myProject-0.1.0.0: configure 
Configuring myProject-0.1.0.0... 
myProject-0.1.0.0: build 
Preprocessing library myProject-0.1.0.0... 
In-place registering myProject-0.1.0.0... 
Preprocessing executable 'myProject-exe' for myProject-0.1.0.0... 
Linking .stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/myProject-exe/myProject-exe ... 
.stack-work/dist/x86_64-linux/Cabal-1.22.5.0/build/myProject-exe/myProject-exe-tmp/MyModule.o: In function `c8QI_info': 
(.text+0x102b): undefined reference to `MyModule_mycfunction' 
collect2: error: ld returned 1 exit status 

-- While building package myProject-0.1.0.0 using: 
     /home/me/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.5.0-ghc-7.10.3 --builddir=.stack-work/dist/x86_64-linux/Cabal-1.22.5.0 build lib:myProject exe:myProject-exe --ghc-options " -ddump-hi -ddump-to-file" 
    Process exited with code: ExitFailure 1 

Before druga próba, dodałem:
- dodano extra-lib-dirs: [/usr/local/lib] do pliku stack.yaml.
- dodano extra-include-dirs: [/usr/local/lib] do pliku stack.yaml (chociaż prawdopodobnie nie jest to konieczne).
- dodano extra-libraries: lMyLib w pliku cabal projektu pod plikiem wykonywalnym etykiet lub biblioteką (próbowałem także extra-libraries: libMyLib.so z tym samym wynikiem).

Druga próba:
[email protected]:~/myProject$ stack build

myProject-0.1.0.0: configure 
Configuring myProject-0.1.0.0... 
setup-Simple-Cabal-1.22.5.0-ghc-7.10.3: Missing dependency on a foreign 
library: 
* Missing C library: lMyLib 
This problem can usually be solved by installing the system package that 
provides this library (you may need the "-dev" version). If the library is 
already installed but in a non-standard location then you can use the flags 
--extra-include-dirs= and --extra-lib-dirs= to specify where it is. 

-- While building package myProject-0.1.0.0 using: 
     /home/me/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.5.0-ghc-7.10.3 --builddir=.stack-work/dist/x86_64-linux/Cabal-1.22.5.0 configure --with-ghc=/home/me/.stack/programs/x86_64-linux/ghc-7.10.3/bin/ghc --with-ghc-pkg=/home/me/.stack/programs/x86_64-linux/ghc-7.10.3/bin/ghc-pkg --user --package-db=clear --package-db=global --package-db=/home/me/.stack/snapshots/x86_64-linux/lts-4.0/7.10.3/pkgdb --package-db=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/pkgdb --libdir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/lib --bindir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/bin --datadir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/share --libexecdir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/libexec --sysconfdir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/etc --docdir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/doc/myProject-0.1.0.0 --htmldir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/doc/myProject-0.1.0.0 --haddockdir=/home/me/myProject/.stack-work/install/x86_64-linux/lts-4.0/7.10.3/doc/myProject-0.1.0.0 --dependency=base=base-4.8.2.0-0d6d1084fbc041e1cded9228e80e264d --dependency=bytestring=bytestring-0.10.6.0-9a873bcf33d6ce2fd2698ce69e2c1c66 --dependency=safe=safe-0.3.9-e3aa437cf6afe091d2ac3ab91bc10ddd --dependency=split=split-0.2.2-10f39ee49f650eefddf38af51b65d10a --extra-include-dirs=/usr/local/lib --extra-lib-dirs=/usr/local/lib --enable-tests --enable-benchmarks 
    Process exited with code: ExitFailure 1 

Więc teraz wie, które C biblioteka potrzebuje, ponieważ skarżył się nim, podczas gdy prawy dodatkowy katalog biblioteczny został dodany (patrz samego końca komunikat o błędzie). Nie jestem pewien, czy komentarz (you may need the "-dev" version) jest odpowiedni, czy nie tutaj.

Moje pytanie: Utknąłem tutaj. Czy jest coś jeszcze, co powinienem zrobić z plikami yaml lub cabal, lub gdzie indziej, aby stack build znalazł bibliotekę C?

+1

Myślę, że powinny to być "dodatkowe biblioteki: MyLib" –

+1

@Reid Barton. To się udało! Teraz wpadam na brzydki '/usr/local/lib/libMyLib.so.2: błąd dodawania symboli: brak DSO z wiersza poleceń' ale jest to problem niezależny od oryginalnego postu, który będę musiał obsługiwać osobno. Proszę zamieścić swoją odpowiedź, a ja ją zaakceptuję. Dzięki! – Janthelme

Odpowiedz

4

extra-libraries powinien mieć tylko nazwę biblioteki podstawowej, więc użyj extra-libraries: MyLib.