Haskell base-4.17.0.0与serialport版本冲突及串口调用异常
问题描述
使用GHC 9.4.2、Cabal 3.8.1.0,调用openSerial打开串口时触发错误:
ghci> ser <- openSerial "COM3" defaultSerialSettings *** Exception: allocaBytesAligned: invalid argument (alignment (=20) must be a power of two!) ghci>
通过Cabal包文件夹确认当前使用的是serialport 0.5.1版本,尝试安装最新版0.5.4时,出现base包依赖冲突:
cabal install --lib serialport-0.5.4 Error: cabal: Could not resolve dependencies: [__0] trying: serialport-0.5.4 (user goal) [__1] next goal: base (dependency of serialport) [__1] rejecting: base-4.17.0.0/installed-4.17.0.0 (conflict: serialport => base>=4.12 && <4.17) [__1] skipping: base-4.17.0.0 (has the same characteristics that caused the previous version to fail: excluded by constraint '>=4.12 && <4.17' from 'serialport') [__1] rejecting: base-4.16.3.0, base-4.16.2.0, base-4.16.1.0, base-4.16.0.0, base-4.15.1.0, base-4.15.0.0, base-4.14.3.0, base-4.14.2.0, base-4.14.1.0, base-4.14.0.0, base-4.13.0.0, base-4.12.0.0, base-4.11.1.0, base-4.11.0.0, base-4.10.1.0, base-4.10.0.0, base-4.9.1.0, base-4.9.0.0, base-4.8.2.0, base-4.8.1.0, base-4.8.0.0, base-4.7.0.2, base-4.7.0.1, base-4.7.0.0, base-4.6.0.1, base-4.6.0.0, base-4.5.1.0, base-4.5.0.0, base-4.4.1.0, base-4.4.0.0, base-4.3.1.0, base-4.3.0.0, base-4.2.0.2, base-4.2.0.1, base-4.2.0.0, base-4.1.0.0, base-4.0.0.0, base-3.0.3.2, base-3.0.3.1 (constraint from non-upgradeable package requires installed instance) [__1] fail (backjumping, conflict set: base, serialport) After searching the rest of the dependency tree exhaustively, these were the goals I've had most trouble fulfilling: base, serialport
尝试删除serialport 0.5.1,但ghc-pkg list的全局包数据库里找不到这个包:
C:\Users\phoenix\Downloads\serialport-0.5.4.tar\serialport-0.5.4>ghc-pkg list C:\ghc\lib\package.conf.d Cabal-3.8.1.0 Cabal-syntax-3.8.1.0 Win32-2.12.0.0 array-0.5.4.0 base-4.17.0.0 binary-0.8.9.1 bytestring-0.11.3.1 containers-0.6.6 deepseq-1.4.8.0 directory-1.3.7.1 exceptions-0.10.5 filepath-1.4.2.2 (ghc-9.4.2) ghc-bignum-1.3 ghc-boot-9.4.2 ghc-boot-th-9.4.2 ghc-compact-0.1.0.0 ghc-heap-9.4.2 ghc-prim-0.9.0 ghci-9.4.2 haskeline-0.8.2 hpc-0.6.1.0 integer-gmp-1.1 libiserv-9.4.2 mtl-2.2.2 parsec-3.1.15.0 pretty-1.1.3.6 process-1.6.15.0 rts-1.0.2 stm-2.5.1.0 system-cxx-std-lib-1.0 template-haskell-2.19.0.0 text-2.0.1 time-1.12.2 transformers-0.5.6.2 xhtml-3000.2.2.1
完全搞不清当前状况,求解决方案。
解决方案
1. 找到并卸载serialport 0.5.1
你看到的Cabal包文件夹里的serialport 0.5.1,大概率不在全局包数据库,而是在用户本地包仓库或者项目的Cabal Store里。试试这些命令定位:
- 查看用户本地安装的所有包:
ghc-pkg list --user - 查看当前项目的Cabal Store包数据库(进入项目目录):
ghc-pkg list --package-db=./.cabal/store/ghc-9.4.2/package.db - 用Cabal直接查询已安装的serialport版本:
cabal list serialport --installed
找到后,用对应命令卸载:
- 如果是用户本地包:
ghc-pkg unregister serialport-0.5.1 --user - 如果是项目本地包:
ghc-pkg unregister serialport-0.5.1 --package-db=./.cabal/store/ghc-9.4.2/package.db
2. 解决serialport与base 4.17的依赖冲突
serialport 0.5.4的base约束是<4.17,而GHC 9.4.2对应base 4.17,所以冲突。有三个可行办法:
办法一:安装兼容base 4.17的serialport版本
直接运行以下命令,让Cabal自动选择兼容当前base的最新版本:
cabal install --lib serialport
(Hackage上serialport 0.5.5及以后版本已支持base 4.17)
办法二:给serialport 0.5.4打补丁兼容base 4.17
如果需要指定0.5.4版本,手动修改源码的依赖约束:
- 下载serialport 0.5.4源码:
cabal get serialport-0.5.4 - 进入源码目录,打开
serialport.cabal文件,找到build-depends里的base行,把base >=4.12 && <4.17改成base >=4.12 && <4.18 - 本地安装修改后的包:
cabal install --lib .
办法三:用Cabal项目环境隔离依赖
不想修改源码的话,创建一个项目环境绕过约束检查:
- 新建一个目录,初始化最小项目:
cabal init --minimal - 在目录下创建
cabal.project文件,写入:constraints: serialport ==0.5.4 allow-newer: serialport:base - 安装依赖并进入项目的GHCI:
cabal build cabal repl
在这个环境里就能正常使用serialport 0.5.4了。
3. 修复allocaBytesAligned错误
这个错误是serialport 0.5.1的已知bug,在新版本中已经修复。只要安装了兼容的serialport版本(比如0.5.4及以上),这个错误就会消失。
内容的提问来源于stack exchange,提问作者phoenixterran
相关产品推荐
相关产品推荐

