我已经为cabal库创建了测试项目。我正在尝试构建简单的项目(使用FFI只有3个.hs文件)。
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构建过程成功使用我的FFI声明和libHSHCabalTestLib-0.1.0.0.a创建Main_stub.h头文件 据我了解,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项目连接? 我该如何解决这种依赖关系?
答案 0 :(得分:1)
尝试链接GHC运行时libHSrts。它可能与你的ghc安装可能在lib/ghc-<version>/rts-1.0/libHSrts*
之下(在Windows上可能与我引用的Linux路径不同)。有很多不同的运行时选择可以链接,包括线程,调试和编辑或不编译。选择哪种方式可能取决于您的应用和环境。
附录:
_base_GHCziIOziHandleziText_hGetContents1_closure
是libHSbase中的符号(通过前缀“ base ”方便地标注),而_ghczmprim_GHCziCString_unpackCStringzh_info
位于libHSghc-prim中,这意味着您还必须链接它们,或命令GHC静态链接您的二进制文件。但是,静态链接可能并非适用于所有软件包,因此在添加新库时,如果需要向链接器添加新输入,请不要感到惊讶。此外,下载的库显然不会与GHC并列,而是在您的用户或全局cabal lib目录中。