2017-01-25 4 views
0

내 프로젝트에서 행렬 곱셈을 수행하기 위해 BLAS_LIB를 사용하고 있습니다. 이것은 내 CMakelist.txt입니다. BLAS_LIB 및 BLAS_INCLUDE 파일 경로가 누락되었습니다. 나는 그것이 아래의 오류에 대한 이유라고 생각합니다. 올바른 이유가 있다면 해결하도록 도와주세요. 내 Qt 프로젝트에 BLAS_LIB를 추가하는 방법은 무엇입니까?

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) 

이이 내 CPP 파일입니다

/home/projects/TestConv/main.cpp:24: undefined reference to `cblas_dgemm' 

오류입니다

#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; 
} 
+0

어떤 CMake 버전입니까? 'cmake --version'을 시도하십시오. – fedepad

+0

안녕하세요, 그것은'cmake 버전 3.5.2' – user8264

+1

'BLAS_LIB와 BLAS_INCLUDE 파일 경로가 없습니다. 나는 그것이 왜곡 오류에 대한 이유라고 생각합니다. 올바른 이유가 있다면 고칠 수 있도록 도와 주시겠습니까? '- 예, 링크가 없으면'정의되지 않은 참조 '오류가 발생합니다. 그것은 당신에게 새로운가요? BLAS 라이브러리를 찾는 것이 문제라면 평소와 같이 [find_package (BLAS)] (https://cmake.org/cmake/help/v3.0/module/FindBLAS.html)가 도움이 될 것입니다. – Tsyvarev

답변

1

예, 완전히 BLAS 라이브러리를 포함하도록 잊고있는 내 CMakeList입니다 .
CMake 버전의 경우 CMake에는 FindBLAS.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) 

가보십시오. 개선 될 수는 있지만 시작해야합니다.

+0

도와 주셔서 감사합니다. BLAS에 대한 새로운 사용자입니다. 나는 그것을 추가했다. CMakeLists.txt에서 CMake Error : 9 (target_link_libraries) :이 프로젝트에 의해 빌드되지 않은 대상 "/usr/lib/libf77blas.so"에 대한 링크 라이브러리를 지정할 수 없다는 오류가 발생했다 .', 이벤트 '- BLAS API가있는 라이브러리가 발견되었습니다. ' – user8264

+0

예, 저의 실수입니다. 업데이트 된 대답을 확인하십시오 .... – fedepad

+0

기본적으로'target_link_libraries (testconv $ {BLAS_LIBRARIES})를 작성하십시오 ' – fedepad