添加GHC性能分析选项触发构建错误:Cannot load -prof objects
问题解答
关于 -dynamic 参数的来源
这个参数大概率来自你的构建工具(Cabal/Stack)的默认配置,或是你当前使用的GHC发行版本身默认启用了动态链接。比如部分Linux发行版提供的GHC包是动态编译的,会自动添加 -dynamic 编译参数;也有可能是Stack的快照配置、Cabal的全局配置里默认开启了动态构建模式,你没手动指定过,但工具自动加上了。
关于“GHC是用-dynamic构建的”的含义
错误提示里的这句话不是说你在构建GHC,而是指你当前用来编译应用的GHC编译器本身,是通过动态链接的方式编译出来的。这种动态构建的GHC在生成性能分析(-prof)相关的目标文件时,会和动态链接机制产生冲突——性能分析需要静态链接的对象文件来收集 profiling 数据,而动态GHC默认生成动态对象,两者无法兼容,因此触发了错误。
解决方法
按照错误提示的两种方案任选其一即可:
- 添加
-fexternal-interpreter参数:在hpack的ghc-options里加上这一项,让GHC使用外部解释器处理profiling,绕开动态链接的冲突。修改后的配置如下:
example-executable: source-dirs: src main: Main.hs ghc-options: - -O2 - -prof - -fprof-auto - -rtsopts - -fexternal-interpreter
- 分两次构建:
- 第一次用动态模式构建:不带
-prof参数,保留-O2(如果工具没自动加-dynamic就手动添加),生成动态链接的目标文件; - 第二次用profiling模式构建,加上
-prof、-fprof-auto,同时用-osuf指定不同的目标文件后缀(比如-osuf prof_o),避免和第一次的动态对象文件冲突。
- 第一次用动态模式构建:不带
另外,如果你不想折腾,也可以尝试换用静态编译版本的GHC(比如从GHC官网下载静态构建的二进制包,而非发行版自带的动态版本),静态GHC处理profiling时不会出现这个问题。
内容的提问来源于stack exchange,提问作者Chris Stryczynski
相关产品推荐
相关产品推荐

