- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在关注Stephen Diehl's excellent LLVM Haskell tutorial在 Linux Mint 盒子上(Linux Mint 17 Qiana、GHC 7.8.4、llvm 3.4)。
我克隆了该项目的 github 存储库,并且能够使用包含的 Makefile
构建每个章节的示例。
在第 4 章中,教程向我们介绍了一个 JIT 编译器:
import qualified LLVM.General.ExecutionEngine as EE
jit :: Context -> (EE.MCJIT -> IO a) -> IO a
jit c = EE.withMCJIT c optlevel model ptrelim fastins
where
optlevel = Just 2 -- optimization level
model = Nothing -- code model ( Default )
ptrelim = Nothing -- frame pointer elimination
fastins = Nothing -- fast instruction selection
runJIT :: AST.Module -> IO (Either String ())
runJIT mod = do
...
jit context $ \executionEngine ->
...
EE.withModuleInEngine executionEngine m $ \ee -> do
mainfn <- EE.getFunction ee (AST.Name "main")
case mainfn of
Just fn -> do
res <- run fn
putStrLn $ "Evaluated to: " ++ show res
Nothing -> return ()
然后本教程通过编写 C 代码来实现操作来扩展该语言。
/* cbits
$ gcc -fPIC -shared cbits.c -o cbits.so
$ clang -fPIC -shared cbits.c -o cbits.so
*/
#include "stdio.h"
// putchard - putchar that takes a double and returns 0.
double putchard(double X) {
putchar((char)X);
fflush(stdout);
return 0;
}
makefile 通过运行来构建项目:
gcc -fPIC -shared src/chapter4/cbits.c -o src/chapter4/cbits.so
ghc -no-user-package-db -package-db .cabal-sandbox/*-packages.conf.d src/chapter4/cbits.so --make src/chapter4/*.hs -o chapter4
但是当我尝试调用 putchard()
时,出现错误:
LLVM ERROR: Program used external function 'putchard' which could not be resolved!
我在这里遗漏了什么吗?
我见过有人对本教程的原始 C++ 版本有类似的问题。他们通常通过向 gcc 构建命令(-rdynamic
)添加一个标志来解决这个问题,该标志应该使链接器将所有符号(而不仅仅是使用过的符号)添加到动态符号表中。我怀疑 ghc 正在从可执行文件中剥离 putchard()
。
当我在 OS X 上执行完全相同的步骤时,一切正常,并且可以毫无问题地调用 putchard()
。
发生了什么事?
我刚刚尝试在 Centos 7 上运行该项目,它成功了。我的 Mint 机器肯定有问题。
最佳答案
也许 GHC 在链接和删除符号时有点过于热心?能否在Main.hs
中使用FFI手动添加引用,然后重新编译。
{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign.C.Types
foreign import ccall safe "putchard" putchard
:: CDouble -> CDouble
关于Haskell llvm-general JIT : calling a C function on the fly. Stephen Diehl 的教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29462859/
我正在尝试设置一个可以随意创建和销毁的玩具数据库。我不想使用 postgres 用户,以防我破坏了一些重要的东西。我做了以下事情: $ psql -h localhost -U postgres po
我一直在自学 C 编程,这是一位精通 C 的 friend 推荐的书。书名是 Stephen Kochan 的“Programming in C”。 我有 Java 背景,我对 Stephen 书中的
问题 我正在查看 Wolfram's Mathematica 生成随机数的方法,发现它使用 Cellular Automata Rule 30 .其基本解释如下: 一个基本元胞自动机的演化可以完全用一
我在 Stephen G Kochan 的书 Programming in c 中看到这段代码。这可能吗? float absolute_value(x) float x; { -----
作为我的学士论文的一部分,我正在尝试使用 Harris 和 Stephens 算法实现角点检测器: A combined Corner and Edge Detector 我确实计算过: 使用 sob
我无法理解公式, 公式中的W(window)和intensity是什么意思, 我在opencv doc中找到了这个公式 http://docs.opencv.org/trunk/doc/py_tuto
8 年前,Stephen Lavavej 发表了 this blog post包含一个简单的分配器实现,名为“Mallocator”。从那时起,我们已经过渡到 C++11(以及很快的 C++17)时代
我正在通过 Stephen Kochan 的《C 语言编程》一书自学 C,并进行了以下关于指针的练习: 编写一个名为 insertEntry 的函数将新条目插入到链接列表中。让该过程将指向要插入的列表
这个问题已经有答案了: Expression Versus Statement (21 个回答) 已关闭 6 年前。 Stephen Prata 的 C Primer Plus 中有一句关于“陈述”的
为什么它说MathOps类别中的分子和分母是未声明的变量? 它位于第11章和程序11.1 不明白为什么它不起作用,因为它与书中的代码相同,没有任何错误。 请帮忙 代码: #import #
我正在关注Stephen Diehl's excellent LLVM Haskell tutorial在 Linux Mint 盒子上(Linux Mint 17 Qiana、GHC 7.8.4、l
我对 Stephen Kochan 编写的《C 语言编程》一书中第 10 章的练习 10 有疑问。 问题是: Write a function called dictionarySort that s
使用 iOS 10.20 和 Swift 3.0想在我的代码中使用这段由 Stephen Poletto 编写的优秀代码,但在 Swift 3.0 中确实需要它。 https://github.com
您好! 我在21.2练习中遇到了麻烦。在那个练习中,我构建了分数计算器。我有 9 个按钮和数学操作。当我在 iOS 模拟器上按任何数字(1、2、3 或任何其他数字)时,它会生成错误: 2012
我是一名优秀的程序员,十分优秀!