我有以下make文件

g++ -Wall -O3 -g -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 Matrix.cc -L /usr/lib64/libcblas.so.0 util.cc word_io.cc net_lbl_2reps_scalable.cc train_lbl_2r_ptb.cc -o train_lbl_2r_ptb

但是我得到了错误



发生错误的函数:
void Matrix::scaleAddABtrans(const Matrix &A, const Matrix &B, float targetScale, float prodScale)
  {
  assert(A.rows() == rows() && A.cols() == B.cols() && B.rows() == cols());
  ::cblas_sgemm(CblasColMajor, CblasNoTrans, CblasTrans,
                A.rows(), B.rows(), A.cols(),
                prodScale, // Scale the product by 1
                A.data(), A.rows(),
                B.data(), B.rows(),
                targetScale, // Scale the target by this before adding the product matrix
                data(), rows());
}

它能够链接文件,但找不到sgemm。无法理解为什么?

最佳答案

如user6292850所述,-L选项采用目录名称,而不是库名称。要命名库,请使用-lcblas。在这种情况下,您可能不需要使用-L,因为/usr/lib64可能位于默认搜索路径上。

另一点建议:在命令行上将链接器选项和库名称放在任何源文件名和对象文件名之后。在中,使通常看起来像这样:

$ c++ $(CXXFLAGS) -o train_lbl_2r_ptb $(SRC) $(LDFLAGS) -lcblas

这样做是因为链接器按原样工作以解析名称。如果在您的示例中util.cc使用cblas函数,则链接器可能找不到它,除非该库在命令行的右侧出现。

关于c++ - 未定义对cblas_sgemm的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37099605/

10-11 16:03