Кабал библиотека, ссылающаяся на MS VS

Я создал тестовый проект для библиотеки Кабала. И я пытаюсь построить простой проект (только с 3 .hs файлами с использованием FFI).

Файл HCabalTestLib.cabal имеет следующий вид:

library
exposed-modules:     Main, Parser.Template, Parser.Data
build-depends:       base ==4.6.*
extensions: ForeignFunctionInterface

Затем я использую следующие команды:
runhaskell Setup.hs настроить
runhaskell Setup.hs build

Процедура сборки Cabal успешно создала заголовочный файл Main_stub.h с моими объявлениями FFI и libHSHCabalTestLib-0.1.0.0.a
Как я понимаю, libHSHCabalTestLib-0.1.0.0.a — это статическая библиотека (я использую Windows).

Наконец, я хочу использовать это в простом проекте MS Visual Studio. Я копирую файл заголовка в папку проекта и копирую файл библиотеки (libHSHCabalTestLib-0.1.0.0.a) в ту же папку.
В свойствах проекта -> компоновщик -> ввод -> дополнительные зависимости я указал свою библиотеку.

После «Build» моего проекта я получил много ошибок компоновщика:

1>CabalStaticLibExperiment.obj : error LNK2019: unresolved external symbol _hs_init referenced in function _main
1>CabalStaticLibExperiment.obj : error LNK2019: unresolved external symbol _hs_exit referenced in function _main
1>libHSHaskellCabalLib-0.1.0.0.lib(Main.o) : error LNK2001: unresolved external symbol _base_GHCziIOziHandleziText_hGetContents1_closure
1>libHSHaskellCabalLib-0.1.0.0.lib(Main.o) : error LNK2001: unresolved external symbol _stg_upd_frame_info
...
1>libHSHaskellCabalLib-0.1.0.0.lib(Data.o) : error LNK2001: unresolved external symbol _ghczmprim_GHCziCString_unpackCStringzh_info
1>CabalStaticLibExperiment.exe : fatal error LNK1120: 56 unresolved externals

У меня следующий вопрос: как мне подключить статическую библиотеку Haskell FFI к проекту MS Visual Studio?
Как я могу разрешить эту зависимость?

2

Решение

Попробуйте связать со средой выполнения GHC, libHSrts. Это должно быть с вашей установкой GHC, вероятно, под lib/ghc-<version>/rts-1.0/libHSrts* (может быть другой путь в Windows, чем путь Linux, который я привел). Существует довольно много разных вариантов выполнения, с которыми можно связать потоки, отладку и тому подобное, скомпилированные или нет. Выбор того, что использовать, вероятно, зависит от вашего приложения и среды.

Приложение:
_base_GHCziIOziHandleziText_hGetContents1_closure является символом в libHSbase (удобно обозначается префиксом «база«), а также _ghczmprim_GHCziCString_unpackCStringzh_info находится в libHSghc-prim, что означает, что вам также придется связать их или дать команду GHC статически связать ваш двоичный файл. Статическое связывание может быть доступно не для всех пакетов, поэтому, при добавлении новой библиотеки, не удивляйтесь, если вам нужно добавить новый ввод в ваш компоновщик. Кроме того, загруженные библиотеки, очевидно, будут находиться не рядом с GHC, а в вашей пользовательской или глобальной директории cabal lib

1

Другие решения