Haskell kodundan kütüphane oluşturmak ve C++ projemde bu kütüphaneyi (paylaşılan kütüphane: dll veya benzeri) kullanmak istiyorum.Cabal ve GHC kullanarak kütüphane binasındaki farklar
Basit eğitici bulduğum: http://blogging.makesmeanerd.com/?p=367 Ve bu örneği başarılı bir şekilde yineleyin.
Ayrıca, ben bu örneği basitleştirmek ve bir sonraki kodu almak:
{-# LANGUAGE ForeignFunctionInterface #-}
module Grep where
import Foreign
import Foreign.C.String
import Data.Char
printCString :: CString -> IO()
printCString s = do
ss <- peekCString s
putStrLn ss
getCStringFromKey :: IO CString
getCStringFromKey = do
guess <- getLine
newCString guess
foreign export ccall printCString :: CString -> IO()
foreign export ccall getCStringFromKey :: IO CString
Öyle çok basit bir program. , Birkaç dosyaları sonra
>ghc -c -O grep.hs
>ghc -shared -o grep.dll grep.o
Creating library file: grep.dll.a
: (benim C++ proje için başlık dosyası) grep.dll, grep.dll.a ve grep_stub.h sonraki komutlar yazdınız. Bu kütüphaneyi C++ projesinde başarılı bir şekilde kullanıyorum. C++ kodu çok basittir (MS Visual Studio kullandım):
#include <iostream>
#include <string>
#include "grep_stub.h"
int main(int argc, char* argv[])
{
std::string testStr;
hs_init(&argc, &argv);
HsPtr str1 = getCStringFromKey();
std::cout << "We've get from Haskell: " << (char*)str1 << std::endl;
HsPtr ss = "Hello from C++!";
printCString(ss);
std::cout << "Test application" << std::endl;
std::cin.get();
hs_exit();
return 0;
}
Derleme sonrasında bu kod çok iyi çalışır.
name: grep
version: 1.0
synopsis: example shared library for C use
build-type: Simple
cabal-version: >=1.10
library
default-language: Haskell2010
exposed-modules: Grep
extra-libraries: HSrts-ghc7.6.3
extensions: ForeignFunctionInterface
build-depends: base >= 4
Ve Cabal yapı sistemi çalıştırmak: Ben Cabal yapılandırma sistemi kullanarak aynı Haskell kod (grep.hs) kurarsan
>cabal configure --enable-shared
>cabal build
...
Creating library file: dist\build\libHSgrep-1.0-ghc7.6.3.dll.a
Başka dll var (küçük boyutu ile) , ama ben MS VS bu dll kullanamazsınız, çünkü ben çok sayıda bağlayıcı hataları (Hashell Platform dll.a dosyaları olsun) olsun.
Ana sorular:
- Cabal'a ve ghc ile inşa kütüphane arasındaki fark nedir?
- GHC ile elde ettiğim gibi Cabal ile aynı dll'yi nasıl kurabilirim?
'cabal build -v2' çalıştırabilir misiniz? Bu cabal komutları gösterir – bennofs
Evet, ama benim için açık değil, el ile GHC – Simplex
çalıştıran eşdeğer yapı için cabal build sistemi nasıl kullanabilirim? Cabal build -v2 'size farklı ne hakkında bir ipucu verebilir Düz ghc yapı ile karşılaştırıldığında Cabal yapı. – bennofs