Sam*_*ber 9 c++ linker gcc rust bazel
我的目标是.a从 MediaPipe 项目中获取Linux 上的静态库,该项目是用 Bazel 构建的。据我所知,这样做没有 bazel 规则。我真的不想与 Bazel 集成 - 我希望它产生我需要的东西,并在其他非 Bazel 管理的东西中使用它。
我正在尝试将使用 Google 构建系统 Bazel 的MediaPipe(https://github.com/google/mediapipe)与一个用 Rust 编写的个人项目集成。我试图弄清楚如何.a从 bazel 构建系统中获取静态库 ( )。我四处搜索,发现有人说他们已经尝试过并做到了,但没有人发布他们所做的事情。
到目前为止,我的尝试是使 bazel 变得冗长(运行-s),然后查看它传递给编译最终二进制文件的命令,以便我可以使用它并修改它以构建一个静态库。我试过解析编译器命令 args 来挑选出所有的目标文件 ( .o) 并ar像这样链接它们ar rcs gpu.a $(grep -E '\.o' bazel-bin/custom/run_gpu-2.params)
该命令有效,但是当我尝试将其链接到 Rust 时,rust 失败了。
这是我的 build.rs
fn main() {
println!("cargo:rustc-link-search=/home/me/dev/mediapipe");
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要
#[link(name = "gpu")]
extern "C" {
fn square(val: i32) -> i32;
}
fn main() {
let r = unsafe { square(3) };
println!("3 squared is {}", r);
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Compiling my-mediapipe-project v0.1.0 (/home/me/dev/my-mediapipe-project)
error: linking with `cc` failed: exit code: 1
|
= note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/home/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.1fmokwdndpsbxaxm.rcgu.o" "/home/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.2j9fb5mr4wpkcnpp.rcgu.o" "/home/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.3bpsevdikgyu7tj9.rcgu.o" "/home/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.48fsbok7dmpjlo4o.rcgu.o" "/home/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.4ezfxccf1xedvrna.rcgu.o" "/home/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.577bi7s5mtonhdwp.rcgu.o" "/home/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.qpj0hauia5ocv8m.rcgu.o" "-o" "/home/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c" "/home/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.22pad9p4rf6ea56q.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-nodefaultlibs" "-L" "/home/me/dev/my-mediapipe-project/target/debug/deps" "-L" "/home/me/dev/mediapipe" "-L" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-lgpu" "-Wl,--start-group" "-Wl,-Bstatic" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-c32b051c3aafd36c.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-eabf8b29c0a244dd.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-5c336cc1b5ec2048.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-c7631f762b1ba6d9.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace-db0f6c539591c951.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace_sys-32c2dc6fbc292c9c.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-84e9c510dc249620.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-13bc027534de0b4c.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-b3c13ecda1794c6c.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-72dc11de859645e9.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-a78b04f112feb31a.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-29469f6c53ac35f8.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-0eb3c513c640c4a6.rlib" "-Wl,--end-group" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-0b278345638bce90.rlib" "-Wl,-Bdynamic" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-lutil"
= note: /usr/bin/ld: cannot find -lgpu
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
这里是手动换行:
error: linking with `cc` failed: exit code: 1
|
= note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/home/me/.rustup/toolchains
/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/home/me/dev/my-
mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.1fmokwdndpsbxaxm.rcgu.o"
"/home/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-
a37e83e58c99436c.2j9fb5mr4wpkcnpp.rcgu.o" "/home/me/dev/my-mediapipe-project/target/debug
/deps/rust_whiteboard-a37e83e58c99436c.3bpsevdikgyu7tj9.rcgu.o" "/home/me/dev/my-mediapipe-
project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.48fsbok7dmpjlo4o.rcgu.o" "/home
/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-
a37e83e58c99436c.4ezfxccf1xedvrna.rcgu.o" "/home/me/dev/my-mediapipe-project/target/debug
/deps/rust_whiteboard-a37e83e58c99436c.577bi7s5mtonhdwp.rcgu.o" "/home/me/dev/my-mediapipe-
project/target/debug/deps/rust_whiteboard-a37e83e58c99436c.qpj0hauia5ocv8m.rcgu.o" "-o" "/home
/me/dev/my-mediapipe-project/target/debug/deps/rust_whiteboard-a37e83e58c99436c" "/home/me/dev
/my-mediapipe-project/target/debug/deps/rust_whiteboard-
a37e83e58c99436c.22pad9p4rf6ea56q.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow"
"-nodefaultlibs" "-L" "/home/me/dev/my-mediapipe-project/target/debug/deps" "-L" "/home/me/dev
/mediapipe" "-L" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib
/x86_64-unknown-linux-gnu/lib" "-lgpu" "-Wl,--start-group" "-Wl,-Bstatic" "/home/me/.rustup
/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-
c32b051c3aafd36c.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib
/x86_64-unknown-linux-gnu/lib/libpanic_unwind-eabf8b29c0a244dd.rlib" "/home/me/.rustup
/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib
/libhashbrown-5c336cc1b5ec2048.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-
gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-
c7631f762b1ba6d9.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib
/x86_64-unknown-linux-gnu/lib/libbacktrace-db0f6c539591c951.rlib" "/home/me/.rustup/toolchains
/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libbacktrace_sys-
32c2dc6fbc292c9c.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib
/x86_64-unknown-linux-gnu/lib/librustc_demangle-84e9c510dc249620.rlib" "/home/me/.rustup
/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-
13bc027534de0b4c.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib
/x86_64-unknown-linux-gnu/lib/libcfg_if-b3c13ecda1794c6c.rlib" "/home/me/.rustup/toolchains
/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-
72dc11de859645e9.rlib" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib
/x86_64-unknown-linux-gnu/lib/liballoc-a78b04f112feb31a.rlib" "/home/me/.rustup/toolchains
/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib
/librustc_std_workspace_core-29469f6c53ac35f8.rlib" "/home/me/.rustup/toolchains/stable-x86_64-
unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-0eb3c513c640c4a6.rlib"
"-Wl,--end-group" "/home/me/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib
/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-0b278345638bce90.rlib" "-Wl,-Bdynamic"
"-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-lutil"
= note: /usr/bin/ld: cannot find -lgpu
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
如果有帮助,我在 Arch Linux 上。MediaPipe 确实为我正确编译 - 我必须修改一些与 OpenCV 相关的定义才能使其正常工作,我发现它记录在 GitHub 问题中。
我真的不想通过 Bazel 管理我的 Rust 代码。我真的很想能够生成一个静态二进制文件,然后通过 Rust/Cargo 使用它。
如果有一个跨平台的解决方案,我真的很喜欢它......
当您在 Bazel 中构建 a 时cc_library,它将编译 atarget_name.{a|so}以及 windows/mac 上的其他共享库扩展,尽管在本例中这似乎并不重要。例如跑步;
$ bazel build //mediapipe/gpu:gpu_service
INFO: Analyzed target //mediapipe/gpu:gpu_service (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //mediapipe/gpu:gpu_service up-to-date:
bazel-bin/mediapipe/gpu/libgpu_service.a
bazel-bin/mediapipe/gpu/libgpu_service.so
INFO: Elapsed time: 0.102s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
Run Code Online (Sandbox Code Playgroud)
注意:在 GitHub codespaces 默认环境(即 Ubuntu Linux)上进行了测试。
请注意,您构建的库的路径将打印到标准输出。IE bazel-bin/mediapipe/gpu/libgpu_service.a。您可以将其复制到任何需要将其集成到您的货物构建中的地方。