You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版本,手动修改源码的依赖约束:

  1. 下载serialport 0.5.4源码:cabal get serialport-0.5.4
  2. 进入源码目录,打开serialport.cabal文件,找到build-depends里的base行,把base >=4.12 && <4.17改成base >=4.12 && <4.18
  3. 本地安装修改后的包:cabal install --lib .

办法三:用Cabal项目环境隔离依赖

不想修改源码的话,创建一个项目环境绕过约束检查:

  1. 新建一个目录,初始化最小项目:cabal init --minimal
  2. 在目录下创建cabal.project文件,写入:
    constraints: serialport ==0.5.4
    allow-newer: serialport:base
    
  3. 安装依赖并进入项目的GHCI:
    cabal build
    cabal repl
    

在这个环境里就能正常使用serialport 0.5.4了。

3. 修复allocaBytesAligned错误

这个错误是serialport 0.5.1的已知bug,在新版本中已经修复。只要安装了兼容的serialport版本(比如0.5.4及以上),这个错误就会消失。


内容的提问来源于stack exchange,提问作者phoenixterran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:36:23