构建 Rust 静态库以在 CGO 中使用
Build Rust static library to use within CGO
我正在尝试将我的 Rust crate 构建为静态库,以便通过 FFI 在 Golang 中进一步使用它。
到目前为止尝试了很多关于链接的不同方法,但仍然有来自最终 go 二进制文件的 undefined reference
类错误:
/usr/bin/ld: ./lib/libsolana_mint.a(nix-6da6fd938c826d01.nix.e161731d-cgu.5.rcgu.o): in function `nix::mqueue::mq_open':
nix.e161731d-cgu.5:(.text._ZN3nix6mqueue7mq_open17hd889faf637ea61f3E+0xd): undefined reference to `mq_open'
/usr/bin/ld: nix.e161731d-cgu.5:(.text._ZN3nix6mqueue7mq_open17hd889faf637ea61f3E+0x1e): undefined reference to `mq_open'
/usr/bin/ld: ./lib/libsolana_mint.a(nix-6da6fd938c826d01.nix.e161731d-cgu.5.rcgu.o): in function `nix::mqueue::mq_unlink':
nix.e161731d-cgu.5:(.text._ZN3nix6mqueue9mq_unlink17hc51e2d94961b863cE+0x6): undefined reference to `mq_unlink'
/usr/bin/ld: ./lib/libsolana_mint.a(nix-6da6fd938c826d01.nix.e161731d-cgu.5.rcgu.o): in function `nix::mqueue::mq_close':
nix.e161731d-cgu.5:(.text._ZN3nix6mqueue8mq_close17h53f48d4def20adadE+0x3): undefined reference to `mq_close'
所有错误都引用了依赖项中的一堆 Rust crate,例如 nix
、solana_sdk
这是我构建的 Dockerfile:
# syntax=docker/dockerfile:1
FROM rust:1.58 as build
RUN apt-get update
RUN apt-get install -y libudev-dev && apt-get install -y pkg-config
WORKDIR /solana
COPY lib/solana_mint ./solana_mint
WORKDIR /solana/solana_mint
RUN RUSTFLAGS='-C target-feature=+crt-static' cargo build --target x86_64-unknown-linux-gnu --release
FROM golang:1.17
WORKDIR /cardforge
COPY --from=build /solana/solana_mint/target/release/libsolana_mint.a ./lib/
COPY ./lib/solana_mint.h ./lib/
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY controllers ./controllers
COPY models ./models
COPY *.go ./
RUN go build main.go
EXPOSE 8080
CMD [ "RUST_LOG=trace ./main" ]
非常感谢任何信息,至于cgo
没有太多高级示例的资源,除了简单的 hello-workd 和单一函数绑定
问题出在 CGO 的正确标志中。
这就是 main.go 中 CGO header 现在的样子
/*
#cgo LDFLAGS: ./lib/libsolana_mint.a -ldl -ludev -lrt -lm
#include "./lib/solana_mint.h"
*/
import "C"
添加 -ludev -rt -lm
解决了链接器和编译的 Docker 映像的所有错误。
奇怪的是,FFI 的任何文档都没有强调这一点
我正在尝试将我的 Rust crate 构建为静态库,以便通过 FFI 在 Golang 中进一步使用它。
到目前为止尝试了很多关于链接的不同方法,但仍然有来自最终 go 二进制文件的 undefined reference
类错误:
/usr/bin/ld: ./lib/libsolana_mint.a(nix-6da6fd938c826d01.nix.e161731d-cgu.5.rcgu.o): in function `nix::mqueue::mq_open':
nix.e161731d-cgu.5:(.text._ZN3nix6mqueue7mq_open17hd889faf637ea61f3E+0xd): undefined reference to `mq_open'
/usr/bin/ld: nix.e161731d-cgu.5:(.text._ZN3nix6mqueue7mq_open17hd889faf637ea61f3E+0x1e): undefined reference to `mq_open'
/usr/bin/ld: ./lib/libsolana_mint.a(nix-6da6fd938c826d01.nix.e161731d-cgu.5.rcgu.o): in function `nix::mqueue::mq_unlink':
nix.e161731d-cgu.5:(.text._ZN3nix6mqueue9mq_unlink17hc51e2d94961b863cE+0x6): undefined reference to `mq_unlink'
/usr/bin/ld: ./lib/libsolana_mint.a(nix-6da6fd938c826d01.nix.e161731d-cgu.5.rcgu.o): in function `nix::mqueue::mq_close':
nix.e161731d-cgu.5:(.text._ZN3nix6mqueue8mq_close17h53f48d4def20adadE+0x3): undefined reference to `mq_close'
所有错误都引用了依赖项中的一堆 Rust crate,例如 nix
、solana_sdk
这是我构建的 Dockerfile:
# syntax=docker/dockerfile:1
FROM rust:1.58 as build
RUN apt-get update
RUN apt-get install -y libudev-dev && apt-get install -y pkg-config
WORKDIR /solana
COPY lib/solana_mint ./solana_mint
WORKDIR /solana/solana_mint
RUN RUSTFLAGS='-C target-feature=+crt-static' cargo build --target x86_64-unknown-linux-gnu --release
FROM golang:1.17
WORKDIR /cardforge
COPY --from=build /solana/solana_mint/target/release/libsolana_mint.a ./lib/
COPY ./lib/solana_mint.h ./lib/
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY controllers ./controllers
COPY models ./models
COPY *.go ./
RUN go build main.go
EXPOSE 8080
CMD [ "RUST_LOG=trace ./main" ]
非常感谢任何信息,至于cgo
没有太多高级示例的资源,除了简单的 hello-workd 和单一函数绑定
问题出在 CGO 的正确标志中。 这就是 main.go 中 CGO header 现在的样子
/*
#cgo LDFLAGS: ./lib/libsolana_mint.a -ldl -ludev -lrt -lm
#include "./lib/solana_mint.h"
*/
import "C"
添加 -ludev -rt -lm
解决了链接器和编译的 Docker 映像的所有错误。
奇怪的是,FFI 的任何文档都没有强调这一点