Экспортируйте lib на Haskell как DLL - PullRequest
0 голосов
/ 05 октября 2018

Я работаю с GHC версии 7.6.1, следуя инструкциям в документации по созданию DLL из библиотеки Haskell для использования ее в VBA: GHC Docs 7.6.1 # Создание библиотеки DLL

Файлы, которые я использую, те же самые, что и в Документах.Когда дело доходит до компиляции, следующие команды работают почти так, как ожидалось:

ghc -c Adder.hs
ghc -c StartEnd.c

Первая команда возвращает это:

Adder.hs:7:1: Warning:
    the 'stdcall' calling convention is unsupported on this platform,
    treating as ccall
    When checking declaration:
      foreign export stdcall "adder" adder :: Int -> Int -> IO Int

Что, я думаю, должно быть хорошо ...

Однако последняя команда ghc -shared -o Adder.dll Adder.o Adder_stub.o StartEnd.o выдает эту ошибку:

Adder_stub.h:1:19:  fatal error: HsFFI.h: No such file or directory
compilation terminated.

Этот поток указал мне на то, что GHC не использует файлы заголовков, расположенные в его GHC-HOME/lib/include.Решением в этой теме было использование GHC с опцией -I [path to include-folder], однако при его попытке (и просмотре man и документов) такой опции для этой версии GHC не существует;в более новых версиях, кроме 8.4.3.

, когда читает эту документацию , я также обнаружил, что должна быть возможность использовать опцию mk-dll в окнах для генерации dll;однако, согласно странице руководства моего установленного GHC, такой опции нет, хотя я скачал и установил установщик Windows 64-bit.

Затем я попытался просто скопировать папку include в другое место;скопировать в папку файлы, необходимые для третьей команды компиляции, и повторить попытку.Он успешно скомпилировал DLL;

Однако, когда я пытаюсь использовать DLL из книги Excel (с поддержкой макросов), я получаю DLL ошибки не найдена.При попытке обратиться к DLL в Excel (через Сервис-> Ссылки-> Обзор-> chooseDll) он говорит мне, что не может добавить DLL.

Изучая DLL с помощью DependencyWalker, я получаю эту ошибку:

Error: At least one required implicit or forwarded dependency was not found.
Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

У вас есть идеи, как решить эту проблему?Большое спасибо ...

Обновление

Когда я пытаюсь использовать скомпилированную библиотеку из C ++, как описано в документации, я получаю это сообщение об ошибке:

PS C:\Users\dev\programming\excel_haskell_binding> ghc -o tester.exe .\Tester.cpp .\include\Adder.dll.a
C:\Users\dev\AppData\Local\Temp\ghc4088_0\ghc4088_0.o:ghc4088_0.c:(.text+0x0): multiple definition of `main'
Tester.o:Tester.cpp:(.text+0x0): first defined here
C:\Users\dev\AppData\Local\Temp\ghc4088_0\ghc4088_0.o:ghc4088_0.c:(.text+0x4f): undefined reference to `ZCMain_main_closure'
c:/ghc/ghc-7.6.1/mingw/bin/../lib/gcc/x86_64-w64-mingw32/4.6.3/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\dev\AppData\Local\Temp\ghc4088_0\ghc4088_0.o: bad reloc address 0x0 in section `.pdata'
collect2: ld returned 1 exit status

Обновление 2

Я тоже пробую другой подход;см. этот вопрос DLL компиляции GHC для использования в VBA

1 Ответ

0 голосов
/ 15 декабря 2018

Я боролся с той же проблемой, но после долгой борьбы мне удалось запустить команду из 64-битного Excel.Выполните следующие действия:

1) Создайте Adder.hs (уведомление ccall, а не stdcall):

{-# LANGUAGE ForeignFunctionInterface #-}
module Adder where

adder :: Int -> Int -> IO Int  -- gratuitous use of IO
adder x y = return (x+y)

foreign export ccall adder :: Int -> Int -> IO Int

2) Создать 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();
}

3) Скомпилируйте эти файлы:

ghc -c Adder.hs
ghc -c StartEnd.c

4) Скопируйте следующие файлы из "C: \ Program Files \ Haskell Platform \ 8.6.3 \ lib \ include" в папку сборки (не забудьте поместить stg / Types.ч в папку stg).Вы также можете скопировать все содержимое папки / include, если хотите:

HsFFI.h
ghcconfig.h
ghcautoconf.h
ghcplatform.h
stg/Types.h

5) Создайте dll:

ghc -shared -o Adder.dll Adder.o Adder_stub.h StartEnd.o

6) Теперь откройте Excel и используйте этот макрос (используйте сначала HsStart перед Adder).Не забудьте указать ссылку на собственную папку:

Private Declare PtrSafe Function Adder Lib "C:\Users\User\haskell\Adder.dll" Alias "adder" _
  (ByVal x As Long, ByVal y As Long) As Long

Private Declare PtrSafe Sub HsStart Lib "C:\Users\User\haskell\Adder.dll" ()
Private Declare PtrSafe Sub HsEnd Lib "C:\Users\User\haskell\Adder.dll" ()

Private Sub Document_Close()
HsEnd
End Sub

Private Sub Document_Open()
HsStart
End Sub

Public Sub Test()
MsgBox "12 + 5 = " & Adder(12, 5)
End Sub

7) Удивитесь!

...