我一直在研究一个Haskell库包,它需要Windows上的自定义.dll和.lib来与某些OS API进行通信..lib与extra-libraries字段链接到库中,DLL安装在cabal包目录中data-files.
出于某种原因(我不是以任何方式链接的专家,但这看起来很奇怪)如果我创建一个使用我的包的测试可执行文件(在build-depends字段中),它想要链接在用于编译的相同的.lib中库 - 即使它只是调用库函数,而不是.lib暴露的任何东西.显然它需要在运行时访问.dll,但这是可以预料的.需要.lib似乎很奇怪.
我希望.lib已经链接到Cabal/GHC为我的库安装时生成的.a文件.这不是这种情况吗?如果是,有人可以解释为什么会这样吗?
cabal repl在库项目中使用时,使用似乎什么都不做,但对可执行项目工作正常.这是我不明白的预期行为吗?
如果我有一个简单的文件
go = putStrLn "test"
Run Code Online (Sandbox Code Playgroud)
并使用cabal init所有默认值(但选择"库"作为类型),然后运行cabal repl只生成一些关于配置和预处理库的文本,并且永远不会进入REPL环境.完全相同的步骤,但选择"可执行"作为类型,使我按预期正确进入GHCi.
直接加载到GHCi时,代码工作正常.
当我安装Haskell/GHC + cabal时,sudo apt-get我安装了cabal版本1.16.这显然不是最新版本.我如何升级至至少1.18版?我想这样做sudo apt-get update和sudo apt-get upgrade.
编辑:
此外,当我运行cabal install cabal-install它似乎"安装"版本1.20,但当我运行cabal -V它说cabal 1.16.0
我有两个正在开发的软件包,A而且B.套餐B取决于A.
A它是在自己的沙盒中开发的,类似的故事也适用于B:
A> cabal sandbox init
A> cabal install --enable-shared
B> cabal sandbox init
B> cabal sandbox add-source ../A/
B> cabal install
Run Code Online (Sandbox Code Playgroud)
还要注意那shared: True是我的~/.cabal/config.
这里的一切看起来都不错,它们都安装得很好.但是,在工作时B,如果我发出cabal repl,cabal-install告诉我它无法加载libAsomething.so/.dll文件.这里出了什么问题?
这是确切的错误:
...
Loading package mtl-0.0.1 ... linking ... done.
Loading package A-0.0.0 ... <command line>: can't load .so/.DLL for: /home/athan/dev/A/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.3/A-0.0.0/libHSA-0.0.0-ghc7.8.3.so (/home/athan/dev/foo/B/.cabal-sandbox/lib/x86_64-linux-ghc-7.8.3/A-0.0.0/libHSA-0.0.0-ghc7.8.3.so: undefined symbol: AsomethingCrazyInAmodule_closure)
Run Code Online (Sandbox Code Playgroud)
编辑:
我正在使用GHC 7.8.3和cabal-install 1.20.0.3.
我首先尝试安装Hlint.cabal install hlint但后来我得到了错误:
cabal: Error: some packages failed to install:
cpphs-1.20.2 depends on old-time-1.1.0.3 which failed to install.
haskell-src-exts-1.18.2 depends on old-time-1.1.0.3 which failed to install.
hlint-1.9.37 depends on old-time-1.1.0.3 which failed to install.
old-time-1.1.0.3 failed during the configure step. The exception was:
ExitFailure 77
Run Code Online (Sandbox Code Playgroud)
然后我尝试安装ghc-mod,因为我读到hlint是该包的依赖项(?).认为它可以解决问题.所以我做了cabal install ghc-mod哪个给了我错误.
cabal: Error: some packages failed to install:
cpphs-1.20.2 depends on old-time-1.1.0.3 which failed to install.
ghc-mod-5.6.0.0 depends on old-time-1.1.0.3 which failed to install.
haskell-src-exts-1.17.1 depends on old-time-1.1.0.3 which …Run Code Online (Sandbox Code Playgroud) 我正在尝试安装hspec,但我得到了这个:
$ cabal install hspec
Resolving dependencies...
cabal: dependencies conflict: ghc-7.2.2 requires containers ==0.4.2.0 however
containers-0.4.2.0 was excluded because ghc-7.2.2 requires containers
==0.4.1.0
Run Code Online (Sandbox Code Playgroud)
这甚至意味着什么?
另外,使用ghc 7.2.2,cabal 10.2.
我首先进行了cabal更新/升级过程,所以我有cabal-install-1.20.0.3.然后我做:
cabal install idris
Run Code Online (Sandbox Code Playgroud)
我明白了:
...
idris-0.9.14.1 (new version)
The following packages are likely to be broken by the reinstalls:
network-2.5.0.0
HTTP-4000.2.17
Use --force-reinstalls if you want to install anyway.
Run Code Online (Sandbox Code Playgroud)
(如果重要,我正在运行OS X 10.9.4)
我是Cabal的新手,这个短语"只有已安装的实例可以使用"对我没有任何意义.
$ cabal install base==4.7.0.0
Resolving dependencies...
cabal: Could not resolve dependencies:
next goal: base (user goal)
rejecting: base-4.7.0.1 (global constraint requires ==4.7.0.0)
rejecting: base-4.7.0.0 (only already installed instances can be used)
rejecting: base-4.6.0.1/installed-8aa..., 4.6.0.1, 4.6.0.0, 4.5.1.0, 4.5.0.0,
4.4.1.0, 4.4.0.0, 4.3.1.0, 4.3.0.0, 4.2.0.2, 4.2.0.1, 4.2.0.0, 4.1.0.0,
4.0.0.0, 3.0.3.2, 3.0.3.1 (global constraint requires ==4.7.0.0)
Dependency tree exhaustively searched.
Run Code Online (Sandbox Code Playgroud)
Cabal试图在这里沟通的是什么?
我最近升级到 Cabal 3.2(和 GHC 8.10),我遇到了一些重大问题,使我的某些项目不再可构建......
这是一个每次都失败的最小(非)工作配置:
我从一个干净的 Cabal 配置开始(删除~/.cabal);原因将在后面的帖子中出现。我运行cabal update以重新创建.cabal目录并确保 Cabal 正常工作。
我test1使用cabal init. 这是一个库项目,带有一个公开的模块(方便地命名Test1),该模块导出一些虚拟函数foo。我跑cabal build,然后cabal install --lib; 一切都运行顺利,到目前为止一切顺利。
可以肯定的是,我离开了项目目录并启动了 GHCi。我输入:m Test1以加载我之前创建的模块,它工作正常!我可以输入foo ...并查看我的函数执行情况。此外,我列出了目录的内容~/.cabal/store/ghc-8.10.xxx并看到该test1-xxx目录在那里。
然后我创建了一个新项目test2,仍然使用cabal init. 这一次,我将其配置为可执行文件,并将其添加test1为依赖项(使用build-depends字段)。但是这次当我运行时cabal build,我遇到了一些问题:
~/projects/haskell/test2> cabal build
Resolving dependencies...
cabal: Could not resolve dependencies:
[__0] trying: test2-0.1.0.0 (user goal)
[__1] …Run Code Online (Sandbox Code Playgroud) cabal 的当前文档显示了一个sandbox子命令。
github 上的相应页面不再包含沙箱部分。
我使用的是 cabal 版本 3.2.0.0,但sandbox子命令不存在。使用 cabal 管理沙箱的正确方法是什么?
显然,文档正在进行彻底修改,其中提到了Nix 风格/new-/v2 命令,但菜鸟不清楚使用 cabal 沙箱的规范方式是什么。
cabal-install ×10
cabal ×9
haskell ×7
dll ×1
ghc ×1
ghci ×1
hlint ×1
idris ×1
package ×1
ubuntu-14.04 ×1