编译c++时链接openblas和mkl库

Link both openblas and mkl library while compiling c++

本文关键字:mkl openblas 链接 c++ 编译      更新时间:2023-10-16

我想写一个程序来比较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/compailers_and_libraries_20199.1.144/mac/mkl/include/mkl.h:31中包含的文件中:/opt/intel/compailers_and_libraries_20199.1.144/mac/mkl/include/mkl_cblas.h:255:6:错误:"cblas_sgemv"的类型冲突void cblas_sgemv(const cblas_LAYOUT LAYOUT,^/usr/local/opt/OpenBLAS/include/cblas.h:125:6:注意:前面的声明在这里

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

我收到了类似的错误

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

/opt/intel/compailers_and_libraries_20199.1.144/mac/mkl/include/mkl_cblas.h:255:6:错误:"cblas_sgemv"的类型冲突void cblas_sgemv(constCBLAS_LAYOUT布局,^/usr/local/opt/OpenBLAS/include/CBLAS.h:125:6:注意:以前的申报在这里

你很幸运。在其他情况下,您可能已经成功编译了程序而没有出现错误,然后在运行时出现意外行为。

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

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

我想写一个程序来比较矩阵乘法的openblas和mkl库

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