如何确保依赖的C库被链接?

问题描述 投票:0回答:1

假设我有静态 C 库 lib1 和 lib2,其中 lib2 中的函数调用 lib1 中的函数。我制作了 lib1-sys 和 lib2-sys 包,它们简单地列出了每个库公开的外部函数,lib2-sys 依赖于 lib1-sys。每个的 Cargo.toml 文件在其链接字段中列出了相应的库,每个文件的 build.rs 只给出了 Cargo:rustc-link-search 和 Cargo:rustc-link-lib。

我的问题是,当我尝试构建依赖于 lib2-sys 的二进制文件(作为单独的板条箱或只是为 lib2-sys 构建测试)时,cargo 不会链接到 lib1,因此我从以下函数中得到了未解决的符号错误lib2 调用 lib1。也就是说,依赖 lib1-sys 显然不足以保证针对 lib1 的链接。这是预期的行为吗?我发现两个似乎有效的修复,哪个是首选或者有什么更好的吗?

  1. 我可以将
    extern crate lib1-sys;
    放在 lib2-sys/lib.rs 的顶部。
  2. 我可以将
    cargo:rustc-link-lib=lib1
    添加到 lib2-sys/build.rs。
rust rust-cargo
1个回答
0
投票

我相信您的经历是预期的行为,尽管遇到起来很烦人。如果另一个箱子被认为“未使用”,并且仅匹配符号并不能消除它,则可以将其排除在链接之外。

添加

extern crate lib1-sys;
似乎是确保链接另一个板条箱的首选方法。如果它是一些外部库而不是板条箱,您将使用
build.rs
指令。

© www.soinside.com 2019 - 2024. All rights reserved.