gpt4 book ai didi

haskell - 如何将自定义对象文件与 Haskell 库链接?

转载 作者:行者123 更新时间:2023-12-03 10:43:39 26 4
gpt4 key购买 nike

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

到目前为止,我尝试使用一种发现的技术 this question .我已将 buildHook 自定义为:

  • 运行 nvcc
  • 运行默认 buildHook
  • 使用 nvcc 编译代码创建 ar 库文件。

  • Setup.hs 可用 here .

    此解决方案的主要缺点是将此包限制为静态链接。尽管 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

    然后我将所有内容链接到一个名为 LibSO 的 C++ 共享库中。使用 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

    在哪里
    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

    这种有帮助吗?

    关于haskell - 如何将自定义对象文件与 Haskell 库链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25424615/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com