CBLAS链接:未定义的"cblas_dgemv"引用



我正在尝试使用CBLAS库使用Blas。我从自定义C函数调用CBLA函数,然后将此文件链接到我的C 文件。但是我得到了这个错误

Cfile.o: In function `mm_blas':
Cfile.c:(.text+0xbf): undefined reference to `cblas_dgemv'
collect2: error: ld returned 1 exit status

我的 cfile.c

#include <stdio.h>
#include <cblas.h>
void f(double dd[])
{
    int i;
      for (i=0; i<2; ++i)  printf("%5.1fn", dd[i]);
    printf("n This is a C coden");
}
    double m[] = {
  3, 1, 3,
  1, 5, 9,
  2, 6, 5
};
double x[] = {
  -1, -1, 1
};
double y[] = {
  0, 0, 0
};
void mm_blas(double m1[], double m2[], double m3[], int m_size){
  cblas_dgemv(CblasRowMajor, CblasNoTrans, 3, 3, 1.0, m, 3, x, 1, 0.0, y, 1);
}

和main.cpp

#include <iostream>
#include <fstream>
#include <random>
#include <chrono>
#include <time.h>
#include <string>
#include <algorithm>
#include <ostream>
using namespace std;
using namespace std::chrono;
extern "C" {
    #include <stdio.h>
    #include <cblas.h>
    void f(double []);
    void mm_blas(double [], double [], double [], int);
}
void func(void)
{
    std::cout<<"n being used within C++ coden";
}
int main(void)
{
    double dd [] = {1,2,3};
    f(dd);
    func();
    return 0;
}

我用命令编译代码

gcc -c -lblas Cfile.c -o Cfile.o  && g++ -std=c++11 -lblas -o  myfoobar Cfile.o main.cpp && ./myfoobar

我在Linux上,GCC 4.8。如何解决此问题。

而不是这样做:

gcc -c Cfile.c -o Cfile.o  && g++ -std=c++11 -o  myfoobar Cfile.o main.cpp -lblas && ./myfoobar

a)将链接选项(-lblas)传递给gcc -c ...没有意义因为 -c表示不链接

b)在链接序列中,默认情况下,必须在需要符号定义的文件之前发生提供定义的人。因此,在库之前的对象文件他们指的是,否则库被忽略,参考文献尚未解决。

最新更新