如何将自定义目标文件与 Haskell 库链接?

2024-04-16

我创建了一个 Haskell 包,它对 CUDA 代码中定义的函数进行 FFI 调用。我想在包构建期间将 .cu 文件编译为对象(.o)文件,并强制链接器将其链接。

到目前为止,我尝试使用一种发现的技术这个问题 https://stackoverflow.com/questions/18543228/statically-linking-a-c-library-with-a-haskell-library。我已将 buildHook 自定义为:

  1. run nvcc
  2. 运行默认的 buildHook
  3. 使用 nvcc 编译代码创建 ar 库文件。

setup.hs 可用here https://gist.github.com/mikusp/51e042013da2c3e2a55f.

该解决方案的一个主要缺点是将该包限制为静态链接。尽管 cabal 生成了一个共享库,但它无法工作,因为它无法解析位于目标文件中的符号。

有没有更简单的方法在构建过程中链接自定义代码?


我也做了类似的事情。我有一个调用 CUDA 代码的 Haskell 文件。

以下是我编译 CUDA 库并与 Haskell 链接的方法:

$(NVCC) -c -E  $(NVCC_OPTS) -o build/file.i file.cu
$(NVCC) -c  $(NVCC_OPTS) -o build/file.o file.cu

然后我将所有内容链接到名为的 C++ 共享库中LibSO带有 Haskell 选项

$(CXX) -shared -Wl,-rpath=\$$$$ORIGIN $(CXX_LINK_LIBS) $(PACKAGE_RPATH) -Lbuild -rdynamic -L/usr/local/lib/ghc-7.6.3 -lHSrts-ghc7.6.3 -o build/LibSO.so build/file.o

where

CXX_LINK_LIBS = -Lbuild -lcudart -lcuda -lpthread -lcupti -lcurand -lnvidia-ml
NVCC_OPTS = --compiler-options -fPIC -maxrregcount=0 --machine 64 --DCUDA

然后我将 Haskell 文件编译成 o 和 hi 文件。 (因为TemplateHaskell我编译了两次)

ghc -v0 -Wall -rtsopts -threaded -stubdir build -ibuild/ -no-hs-main  -o build/iop.o -ohi build/iop.hi -c haskell/iop.lhs
ghc -v0 -Wall -rtsopts -threaded -stubdir build -ibuild/ -no-hs-main  -fPIC -dynamic -osuf dyn_o -hisuf dyn_hi -o build/iop.dyn_o -ohi build/iop.dyn_hi -c haskell/iop.lhs

现在我们有了 Haskell 动态对象和 C++ 共享库。 最后,我将一个主 haskell 文件与所有内容链接起来:

ghc -optl "-Wl,-rpath=\$$ORIGIN" $(CXX_LINK_LIBS) -Lbuild -rtsopts -threaded -lstdc++ -lLibSO -o build/Main build/iop.dyn_o

这有帮助吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将自定义目标文件与 Haskell 库链接? 的相关文章

  • 如何重命名共享库以避免同名冲突?

    我找到了一个图书馆 libjson http sourceforge net projects libjson 我正在尝试将其构建为共享库并在项目中使用 建造很简单 修复 Makefile 错误后 SHARED 1 make install
  • Linux 的 gcc __attribute__((selectany)) 替代方案?

    我想知道是否有替代方案 attribute selectany 在Linux中 我想定义这样的东西 char a qwe zxc 并将其包含在许多链接在一起的 c 文件中 因此链接器将看到 a 的多个定义 因此不会链接 我读过这个属性 se
  • Haskell 中美元符号 ($) 和 id 函数之间有关系吗?

    这几天我正在读一篇评论莫纳德挑战 http mightybyte github io monad challenges 我强烈推荐给像我这样的 Haskell 初学者 我最终得到了这个线程 https news ycombinator co
  • Haskell 中函数和函子有什么区别?只有定义吗?

    在 Haskell 中 当编写函数时 这意味着我们将某个东西 输入 映射到另一个东西 输出 我尝试 LYAH 来理解 Functor 的定义 看起来和普通 Functor 一样 函数被称为函子有什么限制吗 Functor 是否允许有 I O
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • 为什么 Haskell 中有协函子和逆变函子的区别,而范畴论却没有区别?

    这个答案是从范畴论的角度来看的 https math stackexchange com a 661989 72174包括以下语句 事实是 协函子和逆变函子之间没有真正的区别 因为每个函子只是一个协变函子 More in details a
  • Haskell 中的前提条件检查有哪些选项

    这是一个简单的问题 我认为答案很复杂 一个非常常见的编程问题是函数返回某些内容 或者前置条件检查失败 在Java中 我会使用一些抛出异常的断言函数IllegalArgumentException在方法的开头 如下所示 method body
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • 在 Haskell 中,为什么我必须在这段代码中使用美元符号?

    我仍在尝试破解这段代码 import Data Char groupsOf groupsOf n xs take n xs groupsOf n tail xs problem 8 x maximum map product groupsO
  • 使用 g++ 从 cpp 文件和静态库创建共享库 [重复]

    这个问题在这里已经有答案了 就像标题所说 我想从三个 cpp 文件和一些静态库创建共享库 基本上我想这样做 g libProject so file1 cpp file2 cpp file3 cpp I usr local include
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • 将 num 的签名键入 double?

    我才刚刚开始为你学习 Haskell 以获得伟大的好处 并且我在类型类方面遇到了一些麻烦 我想创建一个接受任何数字类型并强制其为双精度的函数 我的第一个想法是定义 numToDouble Num gt Double 但我认为这不起作用 因为
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • Haskell 中的中缀运算符优先级

    对于以下 Haskell 表达式 返回 a gt gt f 应该读作 返回a gt gt f or 返回 a gt gt f 这里的相关规则是什么 规则始终是函数应用程序的优先级高于任何运算符 因此 return a gt gt f 被解析
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • 用于遇到 [...] 的 Haskell Parsec 解析器

    我正在尝试使用 Parsec 在 Haskell 中编写一个解析器 目前我有一个可以解析的程序 test x 1 2 3 end 执行此操作的代码如下 testParser do reserved test v lt identifier

随机推荐

  • Webflux multipart/form-data,启用 csrf,有或没有文件上传获取无效的 CSRF 令牌

    禁用 csrf 后 我可以上传文件 但我需要启用它 仅当表单 enctype 为 multipart form data 时 即 无效的 CSRF 令牌 为 403 时 才会出现此问题 一般来说 当我将 enctype 设置为 multip
  • Jersey 2.0 和 Moxy 内部服务器错误但没有服务器日志

    我遵循了 Jersey 2 0 文档 https jersey java net documentation latest user guide html json moxy https jersey java net documentat
  • jQuery:Gmail 之星?

    我想知道是否有人有关于创建 Gmail 收件箱明星 最喜欢的 的任何好的教程 EDIT 我想我想创建一些类似于 stackoverflow star 或 gmail inbox star 的东西 我有一组列表项 我在其中添加了多个控件 一个
  • 为什么我无法加载 Nokogiri?

    我通过运行以下命令安装了 Nokogiri 没有任何问题 sudo gem install nokogiri Building native extensions This could take a while Successfully i
  • 如何通过 JSch java api 执行 linux 命令“dzdo su - john”并在该用户上执行一些命令,例如“ls -ltr”

    我想使用 java jsch 库连接到远程 Linux 服务器 并使用命令 dzdo su john 切换到另一个用户 并且我想对该用户执行一些命令 我已经尝试了几种方法来满足这一要求 但我无法做到这一点 任何人都可以提供帮助 public
  • OUTPUT INTO 子句中可以使用哪些列?

    我正在尝试构建一个映射表 将表中新行的 ID 与从中复制的行关联起来 OUTPUT INTO 子句似乎对此很完美 但它的行为似乎并不符合文档 My code DECLARE Missing TABLE SrcContentID INT PR
  • 如何检查淘汰赛中的包含

    我正在使用淘汰赛 我有一个 html 页面 我想在其中检查具有某些值的字符串 就像我有一个字符串 A B C D F G H I 一样 我只想用剔除 if 检查 html 中的这个字符串 模型 var viewModel function
  • Spark SQL 广播哈希连接

    我正在尝试使用 SparkSQL 对数据帧执行广播哈希连接记录在这里 https spark apache org docs latest sql performance tuning html join strategy hints fo
  • 使用参考访问地图[重复]

    这个问题在这里已经有答案了 我尝试循环遍历地图 将其作为指向函数的指针传递 但我找不到访问元素的方法 这是代码 func refreshSession sessions map string Session now time Now for
  • Gradle 任务未显示在 Android Studio 4.2 的 gradle 工具窗口中

    我刚刚将 Android Studio 更新到版本 4 2 我很惊讶在我的项目中没有看到 Gradle 任务 在之前的版本 4 1 3 中 我可以看到如下所示的任务 但现在我只看到4 2版本中的依赖项 我尝试清除 Android Studi
  • 通过phpmailer批量发送邮件

    我正在使用 phpmailer 向我的订阅者发送批量电子邮件 但我面临一个可怕的问题 即当我向订阅者发送电子邮件时 每个订阅者都会多次收到相同的电子邮件 有些人获得了 4 次 有些人获得了 14 次 我正在通过 Mysql 表获取 flag
  • 如何确定用户在 JavaScript 中运行的是哪个版本的 IE?

    在一些现有代码中 有一个测试 通过检查对象 Browser Engine trident 是否已定义并返回 true 来查看用户是否正在运行 IE 但如何确定用户运行的是 IE6 或更早版本 还是 IE7 或更早版本 JavaScript
  • 如何在 MaterialButton 或 RaisingButton 上应用主题?

    有人可以帮助指出我们如何定义按钮的基本主题并在每个按钮上使用它吗 我到处寻找才发现textTheme但不是buttonTheme例子 Even on buttonTheme我们如何定义文本颜色 因为在按钮本身上我们可以直接这样做color
  • ASP.Net Core 从另一个控制器调用一个控制器

    在我的 ASP Net Core MVC 6 解决方案中 我有两组控制器 一组包含具有常规视图的网页 另一组包含 API 控制器 为了避免重复数据库逻辑 Web 控制器使用 API 控制器 目前 我正在通过将 DbContext 作为构造函
  • jQuery:多次淡入淡出div

    我在页面顶部有一个 div 我想淡入和淡出 3 次 我已经找到了一个问题 答案 它展示了如何通过将淡入淡出效果放入调用自身的函数中来进行无限循环淡入淡出 但我想知道指定有限数量的淡入淡出周期的最佳方法是什么 到目前为止 这就是我所拥有的 从
  • 资源调度问题

    我正在开发一个摩托车租赁网站 我遇到的问题是如何高效地解决为客人分配摩托车的问题 我知道如何以 愚蠢 的方式做到这一点 但我想知道是否有一种经典算法可以解决此类问题 这与将客人分配到酒店房间是同样的问题 在最后一个示例中 目标是通过不因调度
  • UIActionSheet 着色

    有人知道如何在 uikit 中为 uiactionsheet 着色吗 是的 因为它是一个 UIView 如 kmit 所描述的 您可以使用以下命令 addSubview 因此您可以添加自己的背景并使用 sendSubviewToBack 将
  • 在 JavaScript 中将字符串数组拆分为浮点数数组

    我正在尝试拆分一个称为 顶点 的字符串数组 并将其存储为浮点数组 目前字符串数组包含三个元素 0 1 0 1 1 0 1 1 0 我需要的是一个包含所有这些数字作为单独元素的浮点数组 0 1 0 1 1 0 1 1 0 我使用 split
  • 如何使用键盘快捷键打开弹出窗口? [复制]

    这个问题在这里已经有答案了 可能的重复 jQuery 的键盘快捷键 https stackoverflow com questions 593602 keyboard shortcuts with jquery 我想使用快捷键显示弹出窗口
  • 如何将自定义目标文件与 Haskell 库链接?

    我创建了一个 Haskell 包 它对 CUDA 代码中定义的函数进行 FFI 调用 我想在包构建期间将 cu 文件编译为对象 o 文件 并强制链接器将其链接 到目前为止 我尝试使用一种发现的技术这个问题 https stackoverfl