簡體   English   中英

使用GHC 64位構建的普通Windows DLL無法鏈接

[英]Trivial Windows DLL built with GHC 64-bit does not link

為了進行概念驗證,我想將一些瑣碎的Haskell代碼鏈接到我的Visual C ++應用程序中(使用Visual Studio 2013)。 使用GHC 7.8.3 32位版本進行構建,但是使用GHC 7.8.4 64位版本進行構建(請注意,GHC版本中也存在細微差異)。

有3個文件: Grep.hsStartEnd.c與GHC一起構建以形成DLL。 main.cpp與Visual Studio 2013一起構建,並嘗試在DLL庫中進行鏈接。

我正在從中構建DLL:

> ghc -shared -O -optc-O -o Grep.dll StartEnd.c Grep.hs

從Visual Studio中,我只是鏈接到Grep.dll.a並包含C:\\Program Files\\MinGHC-7.8.4\\ghc-7.8.4\\lib\\include ,但是鏈接失敗

1>main.obj : error LNK2001: unresolved external symbol _HsEnd
1>main.obj : error LNK2001: unresolved external symbol _freegrep
1>main.obj : error LNK2001: unresolved external symbol _grep
1>main.obj : error LNK2001: unresolved external symbol _HsStart
1>C:\Code\Grep\dist\Win32\Release\Grep.exe : fatal error LNK1120: 4 unresolved externals

當我使用32位而不是64位進行構建時,完全相同的過程起作用。 我可能做錯了什么? (嘗試鏈接64位庫時,我正在構建64位應用程序。)

源文件:

Grep.hs

{-# LANGUAGE ForeignFunctionInterface #-}

module Grep where

import Foreign
import Foreign.C.String
import Data.List (isInfixOf)

filterlines f = unlines . filter f . lines

grep :: CString -> CString -> IO CString
grep i s = do
    ii <- peekCString i
    ss <- peekCString s
    newCString $ (filterlines (isInfixOf ii)) ss

freegrep :: CString -> IO ()
freegrep s = free s

foreign export ccall grep :: CString -> CString -> IO CString
foreign export ccall freegrep :: CString -> IO ()

StartEnd.c

#include <Rts.h>

void HsStart()
{
   int argc = 1;
   char* argv[] = {"ghcDll", NULL}; // argv must end with NULL

   // Initialize Haskell runtime
   char** args = argv;
   hs_init(&argc, &args);
}

void HsEnd()
{
   hs_exit();
}

main.cpp中

#include <HsFFI.h>
#include <Grep_stub.h>
#include <iostream>

extern "C" {
    void HsStart();
    void HsEnd();
}

int main(int argc, char* argv[])
{
    HsStart();
    HsPtr str;

    str = grep("test", "This is a test\nwith many lines\nand it failed\nand the test passed");
    if (str)
    {
        std::cout << (char*) str;
        freegrep(str);
    }

    HsEnd();
    return 0;
}

多虧了這些評論,我將實際的錯誤輸出添加到了帖子中。 這使我注意到Visual Studio令人困惑的配置管理界面再次讓我難過。 即使我的配置設置為x64它仍在嘗試構建Win32版本。 長話短說,它正在工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM