【问题标题】:How exactly gsl achieved alternative cblas linking feature?gsl 究竟是如何实现替代 cblas 链接功能的?
【发布时间】:2016-08-06 09:08:24
【问题描述】:

您知道如何设计与 gsl 相同的概念以允许用户在各种 cblas 实现之间切换吗?

AFAIK,gsl 所依赖的 cblas 依赖项应该在 gsl 本身构建时硬编码到 gsl 库中。

2.2.2 与备用 BLAS 库链接

以下命令行显示了如何链接相同的 具有替代 CBLAS 库 libcblas.a 的应用程序,

$ gcc example.o -lgsl -lcblas -lm

为了获得最佳性能,优化了特定于平台的 CBLAS 库 应该用于 -lcblas。图书馆必须符合 CBLAS 标准。 ATLAS 封装提供便携式高性能 BLAS 带有 CBLAS 接口的库。它是免费软件,应该是 安装用于需要快速矢量和矩阵运算的任何工作。 以下命令行将链接到 ATLAS 库及其 CBLAS接口,

$ gcc example.o -lgsl -lcblas -latlas -lm

如果 ATLAS 库安装在非标准目录中,请使用 -L 选项将其添加到搜索路径,如上所述。

有关 BLAS 功能的更多信息,请参阅 BLAS 支持。

【问题讨论】:

    标签: gcc linker dynamic-linking linker-errors


    【解决方案1】:

    这里没有特殊的概念——只是多个库实现了相同的 API 并具有相同的 ABI。

    换句话说,您编写的程序使用来自#include foo.h 的函数int do_stuff(char*)Libfoo.so 是导出符号int do_stuff(char*) 的共享库对象,因为它是从包含int do_stuff(char*) 实现的程序生成的。

    如果您现在编写第二个库来实现所有与libfoo 相同的符号,那么您就可以在libfoo 的位置使用一些东西。

    这就是这里发生的一切。 GSL 使用 BLAS 符号。 BLAS 定义了这些符号的确切含义(阅读:它们的 C 函数签名),因此您可以使用任何您想要的 BLAS 实现。 (假设所有都是用兼容的编译器/链接器构建的)

    【讨论】:

    • 是的,你是对的。我有点困惑如何在不显式链接到 blas 库并将其推迟到应用程序构建时间的情况下构建 gsl 库。我做了一个快速测试来验证你的说法,它有效。谢谢。
    【解决方案2】:

    Blas 库

    gcc -c -Wall -Werror -fpic blas.cpp
    
    gcc -shared -o libblas.so blas.o
    

    GSL 库,实际上是在使用 blas,但我们没有链接到它

    gcc -c -Wall -Werror -fpic gsl.cpp
    
    gcc -shared -o libgsl.so gsl.o
    

    同时链接 gsl 和 blas 的示例应用程序

    gcc -Wall -o main main.cpp -L../mygsl -lgsl -L../mycblas -lblas
    

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 2014-10-11
      • 2021-01-06
      • 2023-03-06
      • 1970-01-01
      • 2016-08-07
      • 2014-12-16
      • 1970-01-01
      • 2013-10-27
      相关资源
      最近更新 更多