2014-05-08 15 views
7

Tôi muốn xây dựng thư viện từ mã Haskell và sử dụng thư viện này (thư viện được chia sẻ: dll hoặc hơn) trong dự án C++ của tôi.Sự khác biệt trong xây dựng thư viện với việc sử dụng Cabal và GHC

Tôi tìm thấy hướng dẫn đơn giản: http://blogging.makesmeanerd.com/?p=367 Và lặp lại thành công ví dụ này.

Hơn nữa, tôi đơn giản hóa ví dụ này, và nhận được mã tiếp theo:

{-# 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 

Đó là chương trình rất đơn giản. Tôi gõ lệnh tiếp theo:

>ghc -c -O grep.hs 
>ghc -shared -o grep.dll grep.o 
Creating library file: grep.dll.a 

Sau đó, tôi có một vài tập tin: grep.dll, grep.dll.a và grep_stub.h (tập tin tiêu đề cho ++ Dự án C của tôi). Tôi thành công sử dụng thư viện này trong dự án C++. Mã C++ rất đơn giản (tôi đã sử dụng MS Visual Studio):

#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; 
} 

Sau khi biên dịch, mã này hoạt động rất tốt.

Nếu tôi xây dựng cùng một mã Haskell (grep.hs) với việc sử dụng Cabal xây dựng hệ thống:

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 

Và chạy Cabal xây dựng hệ thống:

>cabal configure --enable-shared 
>cabal build 
... 
Creating library file: dist\build\libHSgrep-1.0-ghc7.6.3.dll.a 

tôi đã dll khác (với kích thước nhỏ) , nhưng tôi không thể sử dụng dll này trong MS VS, bởi vì tôi nhận được rất nhiều lỗi linker (bao giờ nếu tôi nhận được các tập tin dll.a từ Haskell Platform).

câu hỏi chính:

  • khác biệt giữa xây dựng thư viện với Cabal và GHC là gì?
  • Làm cách nào để tôi có thể xây dựng cùng một dll với Cabal, như tôi nhận được với GHC?
+0

Bạn có thể chạy 'cabal build -v2' không? Nó cho thấy các lệnh cabal thực hiện – bennofs

+0

Có, nhưng nó không phải là rõ ràng đối với tôi, làm thế nào tôi có thể sử dụng cabal xây dựng hệ thống cho xây dựng tương đương với sử dụng bằng tay GHC – Simplex

+3

chạy 'cabal build -v2' có thể cung cấp cho bạn một gợi ý về những gì khác nhau trong Cabal xây dựng so với xây dựng ghc đồng bằng. – bennofs

Trả lời

1

Bạn có thể đặt tùy chọn bổ sung trong tệp cabal bằng cách thêm ghc-options vào cài đặt thư viện của mình. Không chắc chắn những gì là cần thiết trong trường hợp của bạn, nhưng tôi đã chạy vào cùng một vấn đề (lib nhỏ, mối liên kết lỗi) và đối với tôi các thiết lập sau đây giải quyết nó:

ghc-options: -staticlib

Nhưng tôi sử dụng trong một dự án iOS trong Xcode.

Các vấn đề liên quan