代码之家  ›  专栏  ›  技术社区  ›  Makogan

为什么使用`extern`允许运行时链接?

  •  0
  • Makogan  · 技术社区  · 9 月前

    我有这个代码片段:

        extern crate blas;
        extern crate openblas_src;
        pub fn eigen_decompose_symmetric_tri_diagonal(
            main_diag: &Vec<f64>,
            sub_diag: &Vec<f64>,
        )
        {
         /* code */
        lapack::dsteqr(/* args */);
        /* code */
        }
    
    

    那是用翻领装订的。我不明白的是,如果我注释掉这两个extern语句,我会得到一个链接器错误,其中 dsteqr 未找到。我想知道为什么会发生这种情况。

    1 回复  |  直到 9 月前
        1
  •  3
  •   kmdreko    9 月前

    我已经发布 an answer 对于类似的问题(也关于openblas, extern crate ,以及没有它的链接器错误),但我将在这里总结。

    基本上,如果编译器推断出某个依赖关系“未使用”,它将把它排除在链接步骤之外。我希望我有一个明确的来源来记录这种行为,但我还没有找到。有趣的是,依赖性仍然存在 建造 因为Cargo希望它被使用,但这是最终的 rustc 调用中包含了省略的最终链接。

    这通常不是问题;一个正常的依赖链通常会有一个“安全”的API机箱,它依赖于 -sys 捆绑板条箱 links= 到系统库。如果你添加了一个货物依赖关系,但根本不使用它,那么最好不要要求运行时链接,如果你添加货物依赖关系并使用它,这将被视为“使用”于它使用的该依赖关系的任何依赖关系(一直到声明链接的低级依赖关系)。

    blas/lapack遇到这种情况的原因是,存在竞争性的本机库(accelerate、blis、intel-mkl、netlib、openblas),它们提供了高级库所依赖的功能 -sys 同行,但缺乏 链接= 到特定的系统库。因此,它们只是依靠全局符号在链接时将它们联系起来,不幸的是,正如您所遇到的,除非最终用户 外部板条箱 这是其中之一 -src 实施板条箱。更多关于他们的信息 blas-lapack-rs wiki .