cblas 链接:对“cblas_dgemv”的未定义引用
cblas linking: undefined reference to `cblas_dgemv'
我正在尝试使用 cblas 库来使用 BLAS。我从自定义 C 函数调用 cblas 函数,然后 link 这个文件到我的 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.1f\n", dd[i]);
printf("\n This is a C code\n");
}
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++ code\n";
}
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) 将 link年龄选项 (-lblas
) 传递给 gcc -c ...
没有意义
因为 -c
意味着 不要 link.
b) 在linkage序列中,默认情况下,需要符号定义的文件必须出现在
那些提供定义的。所以目标文件在库之前
他们引用,否则库将被忽略并且引用未解析。
我正在尝试使用 cblas 库来使用 BLAS。我从自定义 C 函数调用 cblas 函数,然后 link 这个文件到我的 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.1f\n", dd[i]);
printf("\n This is a C code\n");
}
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++ code\n";
}
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) 将 link年龄选项 (-lblas
) 传递给 gcc -c ...
没有意义
因为 -c
意味着 不要 link.
b) 在linkage序列中,默认情况下,需要符号定义的文件必须出现在 那些提供定义的。所以目标文件在库之前 他们引用,否则库将被忽略并且引用未解析。