在编译C ++的同时链接openblas和mkl库

时间:2019-01-27 18:12:45

标签: c++ linker intel-mkl openblas

我想编写一个比较openblas和mkl库进行矩阵乘法的程序,但是在链接这两个库时它们共享相同的功能时似乎出现了问题,因此与g ++会产生“冲突错误”。

它们似乎可以分别在不同的cpp文件中运行

g++ matrixmult_openblas.cpp -I /usr/local/opt/OpenBLAS/include/ -L/usr/local/opt/OpenBLAS/lib -lopenblas

g++ matrixmult_mkl.cpp -L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_mpich_ilp64 -liomp5 -lpthread -lm -ldl

如何在单个cpp文件中编译它们? 我已经使用了像这样的命名空间

namespace openblas
{
    #include <cblas.h>
}
namespace mkl
{
    #include <mkl.h>
}

当我使用两个链接器编译它们时,

g++ matrixmult.cpp -I /usr/local/opt/OpenBLAS/include/ -L/usr/local/opt/OpenBLAS/lib -lopenblas -L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -lmkl_blacs_mpich_ilp64 -liomp5 -lpthread -lm -ldl

我遇到类似

的错误
  

在/opt/intel/compilers_and_libraries_2019.1.144/mac/mkl/include/mkl.h:31中包含的文件中:   /opt/intel/compilers_and_libraries_2019.1.144/mac/mkl/include/mkl_cblas.h:255:6:错误:“ cblas_sgemv”的类型冲突   void cblas_sgemv(const CBLAS_LAYOUT布局,        ^   /usr/local/opt/OpenBLAS/include/cblas.h:125:6:注意:以前的声明在这里

请帮助我做到这一点。 我想要一个输出文件,在其中我可以将参数'openblas'或'mkl'传递给主函数以使用任何库。

1 个答案:

答案 0 :(得分:3)

  

我遇到类似的错误

     
In file included from /opt/intel/compilers_and_libraries_2019.1.144/mac/mkl/include/mkl.h:31:
         

/opt/intel/compilers_and_libraries_2019.1.144/mac/mkl/include/mkl_cblas.h:255:6:     错误:“ cblas_sgemv”的类型冲突void cblas_sgemv(const     CBLAS_LAYOUT布局,^ /usr/local/opt/OpenBLAS/include/cblas.h:125:6:     注意:先前的声明在这里

  

您很幸运。在其他情况下,您可能会成功地将程序编译成功且没有错误,然后在运行时表现异常。

  

如何在单个cpp文件中编译它们?

你不知道。 OpenBLAS和MKL提供具有相同名称并带有C链接的例程。即使它们具有兼容的类型,编译后的程序也将仅使用每对中的一个。您无法通过处理声明或头文件来解决此问题,因为声明或头文件需要与实际的编译函数匹配才能使用。

  

我想编写一个程序来比较openblas和mkl库以进行矩阵乘法

您将不得不编写两个程序,每个库一个。使它们尽可能相似,并比较它们在相同(或等效)输入上的行为。