首页 文章

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

提问于
浏览
25

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

到目前为止,我试图使用一种技术this question . 我已经定制buildHook到:

  • 运行nvcc

  • 运行默认buildHook

  • 使用nvcc编译代码创建ar库文件 .

Setup.hs可用here .

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

在构建期间是否有更简单的方法来链接自定义代码?

1 回答

  • 2

    我做了类似的事情 . 我有一个调用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
    

    这种帮助吗?

相关问题