我有以下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
但是我收到了错误
/tmp/cc9NLGFL.o:在函数
Matrix::scaleAddAB(Matrix const&, Matrix const&, float, float)': /home/ncelm/Matrix.cc:316: undefined reference to
cblas_sgemm'中 /tmp/cc9NLGFL.o:在函数Matrix::scaleAddAtransB(Matrix const&, Matrix const&, float, float)': /home/ncelm/Matrix.cc:330: undefined reference to
cblas_sgemm'中 /tmp/cc9NLGFL.o:在函数Matrix::scaleAddABtrans(Matrix const&, Matrix const&, float, float)': /home/ncelm/Matrix.cc:344: undefined reference to
中cblas_sgemm'
发生错误的函数:
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
。无法理解为什么?
答案 0 :(得分:0)
正如user6292850所述,-L
选项采用目录名,而不是库名。要命名库,请使用-lcblas
。在这种情况下,您可能不需要使用-L
,因为/usr/lib64
可能位于默认搜索路径上。
另外一点建议:在命令行上的任何源和目标文件名之后放置链接器选项和库名。在 make 中,它通常看起来像这样:
$ c++ $(CXXFLAGS) -o train_lbl_2r_ptb $(SRC) $(LDFLAGS) -lcblas
你这样做是因为链接器按原样顺利运行,以解析名称。如果在您的示例中,util.cc
使用了cblas函数,则链接器可能找不到它,除非库出现在命令行的右侧。