#haskell
#хаскелл
Вопрос:
У меня есть супер базовый тестовый модуль, чтобы попытаться использовать Windows DLL:
{-# LANGUAGE ForeignFunctionInterface #-}
module Fface where
import Foreign
import Foreign.C.Types
newtype FFACE = FFACE (Ptr FFACE)
foreign import stdcall unsafe "FFACE4.h CreateInstance"
c_CreateInstance :: CUInt -> IO (Ptr FFACE)
При попытке скомпилировать его в простую тестовую программу я получаю следующую ошибку:
Linking Main.exe ...
.Fface.o:fake:(.text 0x18): undefined reference to `CreateInstance@4'
collect2.exe: error: ld returned 1 exit status
Используя gendef для сброса списка экспорта из библиотеки DLL, я вижу, что функция фактически экспортируется как «CreateInstance @1925», но почти все остальные функции экспортируются только как их простое имя без каких-либо элементов @number. Для чего нужен @1925 и как я могу заставить GHC использовать его вместо @4?
Комментарии:
1. Это не отвечает на ваш вопрос, но один из способов устранения ошибок нечетного компоновщика — использовать динамическую загрузку. См. раздел System.Win32.DHCP библиотеки моего Win32-dhcp-сервера.Win32.DHCP. Внутренний модуль для примера.