如何在我的 Qt 项目中添加 BLAS_LIB?
How to add BLAS_LIB in my Qt project?
我在我的项目中使用 BLAS_LIB 来执行矩阵乘法。这是我的CMakelist.txt。它缺少 BLAS_LIB 和 BLAS_INCLUDE 文件的路径。我认为这是以下错误的原因。如果是正确的原因,请帮我解决一下?
这是我的 CMakeList
cmake_minimum_required(VERSION 2.6)
project(testconv)
if(UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++0x")
endif()
add_executable(testconv main.cpp)
install(TARGETS testconv RUNTIME DESTINATION bin)
这是错误
/home/projects/TestConv/main.cpp:24: undefined reference to `cblas_dgemm'
这是我的cpp文件
#include <iostream>
#include <random>
#include <cblas.h>
int main ( int argc, char* argv[] ) {
//Random numbers
std::mt19937_64 rnd;
std::uniform_real_distribution<double> doubleDist(0, 1);
//Create Arrays that represent the matrices A,B,C
const int n = 20;
double* A = new double[n*n];
double* B = new double[n*n];
double* C = new double[n*n];
//Fill A and B with random numbers
for(uint i =0; i <n; i++){
for(uint j=0; j<n; j++){
A[i*n+j] = doubleDist(rnd);
B[i*n+j] = doubleDist(rnd);
}
}
//Calculate A*B=C
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, n, n, n, 1.0, A, n, B, n, 0.0, C, n);
//Clean up
delete[] A;
delete[] B;
delete[] C;
return 0;
}
是的,您完全忘记了包含 BLAS 库。
对于您的 CMake 版本,CMake 包含一个 FindBLAS.cmake
文件,该文件不适用于您的情况。
您将需要 FindCBLAS.cmake
来正确找到 BLAS 的 C 接口,就像在其他开源项目中所做的那样。
例如,您可以获取以下 https://github.com/Eyescale/CMake/blob/master/FindCBLAS.cmake.
首先,您需要在项目根目录(不是构建目录!!!)中创建一个名为 cmake
的目录,然后复制我刚才提到的那个文件 (FindCBLAS.cmake
).
您需要在以下方面修改您的 CMakeLists.txt
:
cmake_minimum_required(VERSION 2.6)
project(testconv)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
find_package(CBLAS REQUIRED)
include_directories(${CBLAS_INCLUDE_DIR})
if(UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++0x")
endif()
add_executable(testconv main.cpp)
target_link_libraries(testconv ${CBLAS_LIBRARIES})
install(TARGETS testconv RUNTIME DESTINATION bin)
试试看。它可以改进,但应该让你开始。
我在我的项目中使用 BLAS_LIB 来执行矩阵乘法。这是我的CMakelist.txt。它缺少 BLAS_LIB 和 BLAS_INCLUDE 文件的路径。我认为这是以下错误的原因。如果是正确的原因,请帮我解决一下?
这是我的 CMakeList
cmake_minimum_required(VERSION 2.6)
project(testconv)
if(UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++0x")
endif()
add_executable(testconv main.cpp)
install(TARGETS testconv RUNTIME DESTINATION bin)
这是错误
/home/projects/TestConv/main.cpp:24: undefined reference to `cblas_dgemm'
这是我的cpp文件
#include <iostream>
#include <random>
#include <cblas.h>
int main ( int argc, char* argv[] ) {
//Random numbers
std::mt19937_64 rnd;
std::uniform_real_distribution<double> doubleDist(0, 1);
//Create Arrays that represent the matrices A,B,C
const int n = 20;
double* A = new double[n*n];
double* B = new double[n*n];
double* C = new double[n*n];
//Fill A and B with random numbers
for(uint i =0; i <n; i++){
for(uint j=0; j<n; j++){
A[i*n+j] = doubleDist(rnd);
B[i*n+j] = doubleDist(rnd);
}
}
//Calculate A*B=C
cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, n, n, n, 1.0, A, n, B, n, 0.0, C, n);
//Clean up
delete[] A;
delete[] B;
delete[] C;
return 0;
}
是的,您完全忘记了包含 BLAS 库。
对于您的 CMake 版本,CMake 包含一个 FindBLAS.cmake
文件,该文件不适用于您的情况。
您将需要 FindCBLAS.cmake
来正确找到 BLAS 的 C 接口,就像在其他开源项目中所做的那样。
例如,您可以获取以下 https://github.com/Eyescale/CMake/blob/master/FindCBLAS.cmake.
首先,您需要在项目根目录(不是构建目录!!!)中创建一个名为 cmake
的目录,然后复制我刚才提到的那个文件 (FindCBLAS.cmake
).
您需要在以下方面修改您的 CMakeLists.txt
:
cmake_minimum_required(VERSION 2.6)
project(testconv)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
find_package(CBLAS REQUIRED)
include_directories(${CBLAS_INCLUDE_DIR})
if(UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++0x")
endif()
add_executable(testconv main.cpp)
target_link_libraries(testconv ${CBLAS_LIBRARIES})
install(TARGETS testconv RUNTIME DESTINATION bin)
试试看。它可以改进,但应该让你开始。