gpt4 book ai didi

haskell - 如何将 Haskell 库与 Rust 项目静态链接?

转载 作者:行者123 更新时间:2023-12-04 18:11:05 31 4
gpt4 key购买 nike

到目前为止,我没有将 Haskell 库链接到 Rust 项目的运气。我有很多错误,最新的是 recompile with -fPIC对于 ghc .
我设法获得了一个动态链接的功能示例——但无法将其静态链接。
现在附加我当前的设置:

  • 构建.rs
    fn main() {
    println!("cargo:rustc-link-search=native=deps");
    println!("cargo:rustc-link-lib=static=tesths");
    }
  • src/main.rs
    extern "C" {
    pub fn addTwo(x: i32) -> i32;
    pub fn init();
    pub fn fin();
    }

    fn main() {
    println!("Hello, world!");
    }
  • src/haskell/Lib.hs
    module Lib where

    import Foreign.C.Types

    addTwo :: CInt -> CInt
    addTwo = (2 + )

    foreign export ccall addTwo :: CInt -> CInt
  • 包装器.c
    #include <HsFFI.h>
    #ifdef __GLASGOW_HASKELL__
    #include "Lib_stub.h"
    #endif
    #include <stdio.h>

    void init(void) {
    static char *argv[] = {"libhs.so", 0}, **argv_ = argv;
    static int argc = 1;

    hs_init(&argc, &argv_);
    }

    void fin(void) { hs_exit(); }

  • 我用 ghc -c -static -lHSrts -lffi cwrapper.c 编译 #4 , 得到 cwrapper.o .同样,我用 ghc -c -static -fPIC -lffi Lib.hs 编译#3并获得目标代码。
    完成后,我继续使用 ar rcs libtesths.a Lib.o cwrapper.o 归档这两个文件。 .
    cargo build :
    note: /usr/bin/ld: deps/libtesths.a(Lib.o):(.text+0x29): undefined reference to `newCAF'
    /usr/bin/ld: deps/libtesths.a(Lib.o):(.text+0x39): undefined reference to `stg_bh_upd_frame_info'
    /usr/bin/ld: deps/libtesths.a(Lib.o):(.text+0x48): undefined reference to `base_ForeignziCziTypes_zdfNumCInt_closure'
    /usr/bin/ld: deps/libtesths.a(Lib.o):(.text+0x4f): undefined reference to `stg_ap_p_info'

    我有一种预感,libHSrts 出于某种原因没有被静态链接。
    更新
    我听从了 Shepmaster 的建议,成功地做了一个可行的例子。但我现在与我的 rust 执行官链接时遇到了问题。
    我将堆栈与 ghc-options: -staticlib -stubdir . 一起使用和 c-sources: cwrapper.c build 。当我尝试使用 cargo rustc — -C relocation-model=static 构建 rust 项目时:
    /usr/bin/ld: deps/liba.a(Type.o): in function `integerzmwiredzmin_GHCziIntegerziType_zdwplusBigNatWord_info'
    (.text.integerzmwiredzmin_GHCziIntegerziType_zdwplusBigNatWord_info+0x128): undefined reference to `__gmpn_add_1'
    /usr/bin/ld: deps/liba.a(Type.o): in function
    `integerzmwiredzmin_GHCziIntegerziType_zdwminusBigNatWord_info'
    (.text.integerzmwiredzmin_GHCziIntegerziType_zdwminusBigNatWord_info+0xdf): undefined reference to `__gmpn_sub_1'
    /usr/bin/ld: deps/liba.a(Type.o): in function `integerzmwiredzmin_GHCziIntegerziType_complementInteger_info'
    (.text.integerzmwiredzmin_GHCziIntegerziType_complementInteger_info+0x138): undefined reference to `__gmpn_sub_1'
    /usr/bin/ld: deps/liba.a(Type.o): in function `integerzmwiredzmin_GHCziIntegerziType_zdwtimesBigNatWord_info'
    (.text.integerzmwiredzmin_GHCziIntegerziType_zdwtimesBigNatWord_info+0x158): undefined reference to `__gmpn_mul_1'
    还提到了 wrappers.o .任何帮助表示赞赏。
    更新 2
    我解决了 gmp通过设置 build.rs链接 libgmp也是。不过,我现在有一个不同的问题。

    note: /usr/bin/ld: deps/libhssource.a(Lib.o): in function `testFFI':
    (.text+0x88fd): multiple definition of `testFFI'; deps/libhssource.a(Lib.o):(.text+0x1b66): first defined here
    /usr/bin/ld: deps/libhssource.a(cwrapper.o): in function `init':
    cwrapper.c:(.text+0x0): multiple definition of `init'; deps/libhssource.a(cwrapper.o):cwrapper.c:(.text+0x0): first defined here
    /usr/bin/ld: deps/libhssource.a(cwrapper.o): in function `fin':
    cwrapper.c:(.text+0x20): multiple definition of `fin'; deps/libhssource.a(cwrapper.o):cwrapper.c:(.text+0x1a): first defined here
    collect2: error: ld returned 1 exit status
    更新 3
    这是解决问题的最终构建命令:
    cargo rustc -- -C relocation-model=static -Clink-arg=-Wl,--allow-multiple-definition
    使用 RUSTFLAGS将导致构建崩溃,因为它使用静态重定位模型构建所有依赖项,在我的情况下,这对于 rustversion 不起作用箱。它将报告 recompile with -fPIC错误。

    最佳答案

    我一次编译了 Haskell 库和 C shim,通过了 -staticlib 旗帜:

    ghc -c -staticlib Lib.hs cwrapper.c -o libtesths.a
    然后我调用了这些函数:
    extern "C" {
    pub fn addTwo(x: i32) -> i32;
    pub fn init();
    pub fn fin();
    }

    fn main() {
    unsafe {
    init();
    println!("{}", addTwo(40));
    fin();
    }
    }
    % cargo run -q
    42
    这在使用 GHC 8.10.7 的 Apple Silicon 处理器上的 macOS 12.0.1 上对我有用。
    如果您使用的是 x86_64 Linux,您可能需要添加 RUSTFLAGS='-C relocation-model=static' .

    关于haskell - 如何将 Haskell 库与 Rust 项目静态链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70102465/

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