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?
Myślę, że powinny to być "dodatkowe biblioteki: MyLib" –
@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