Can';t链接BLAS库与Clion 2016.1.2和Fedora 22,获得未定义的参考

Can';t链接BLAS库与Clion 2016.1.2和Fedora 22,获得未定义的参考,c,cmake,fedora,blas,clion,C,Cmake,Fedora,Blas,Clion,我今天一整天都在为这个问题苦苦挣扎。我相信我在CMake上遗漏了一些小东西,因为这是我第一次使用它,我有所有这些错误 我的问题是,无论我如何更改或在Cmake文件中包含什么,我都会不断收到此错误 [ 25%] Linking CXX executable Matrix_Benchmark CMakeFiles/Matrix_Benchmark.dir/main.cpp.o: In function `run_benchmark(double*, double*, double*, int, in

我今天一整天都在为这个问题苦苦挣扎。我相信我在CMake上遗漏了一些小东西,因为这是我第一次使用它,我有所有这些错误

我的问题是,无论我如何更改或在Cmake文件中包含什么,我都会不断收到此错误

[ 25%] Linking CXX executable Matrix_Benchmark
CMakeFiles/Matrix_Benchmark.dir/main.cpp.o: In function `run_benchmark(double*, double*, double*, int, int, int, int)':
/home/lumx/git_projects/memory-traces/src/Matrix_Benchmark/main.cpp:202: undefined reference to `cblas_dgemm'
collect2: error: ld returned 1 exit status
我相信Blas和OpenBlas有问题,因为Blas或Blas-devel包没有cblas.h,我必须安装OpenBlas和开发库

到目前为止,我尝试了很多东西,我将包括一个凌乱的Cmake文件。对此我很抱歉,但我希望有人会发现更多错误,并帮助我改进这些错误

cmake_minimum_required(VERSION 3.5)
#set( CMAKE_VERBOSE_MAKEFILE on )
set( CMAKE_VERBOSE_MAKEFILE off )
project(Matrix_Benchmark)

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Werror -Wfatal-errors -Wall -O2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wfatal-errors -Wall -O2")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wfatal-errors -Wall -O2")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")

#https://github.com/BVLC/caffe/blob/master/cmake/Modules/FindOpenBLAS.cmake
SET(Open_BLAS_INCLUDE_SEARCH_PATHS
        /usr/include
        /usr/include/openblas
        /usr/include/openblas-base
        /usr/local/include
        /usr/local/include/openblas
        /usr/local/include/openblas-base
        /opt/OpenBLAS/include
        $ENV{OpenBLAS_HOME}
        $ENV{OpenBLAS_HOME}/include
        )

SET(Open_BLAS_LIB_SEARCH_PATHS
        /lib/
        /lib/openblas-base
        /lib64/
        /usr/lib
        /usr/lib/openblas-base
        /usr/lib64
        /usr/local/lib
        /usr/local/lib64
        /opt/OpenBLAS/lib
        $ENV{OpenBLAS}cd
        $ENV{OpenBLAS}/lib
        $ENV{OpenBLAS_HOME}
        $ENV{OpenBLAS_HOME}/lib
        )

FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Open_BLAS_INCLUDE_SEARCH_PATHS})
FIND_LIBRARY(OpenBLAS_LIB NAMES openblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS})

SET(OpenBLAS_FOUND ON)

#    Check include files
IF(NOT OpenBLAS_INCLUDE_DIR)
    SET(OpenBLAS_FOUND OFF)
    MESSAGE(STATUS "Could not find OpenBLAS include. Turning OpenBLAS_FOUND off")
ENDIF()

#    Check libraries
IF(NOT OpenBLAS_LIB)
    SET(OpenBLAS_FOUND OFF)
    MESSAGE(STATUS "Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off")
ENDIF()

IF (OpenBLAS_FOUND)
    IF (NOT OpenBLAS_FIND_QUIETLY)
        MESSAGE(STATUS "Found OpenBLAS libraries: ${OpenBLAS_LIB}")
        MESSAGE(STATUS "Found OpenBLAS include: ${OpenBLAS_INCLUDE_DIR}")
    ENDIF (NOT OpenBLAS_FIND_QUIETLY)
ELSE (OpenBLAS_FOUND)
    IF (OpenBLAS_FIND_REQUIRED)
        MESSAGE(FATAL_ERROR "Could not find OpenBLAS")
    ENDIF (OpenBLAS_FIND_REQUIRED)
ENDIF (OpenBLAS_FOUND)

MARK_AS_ADVANCED(
        OpenBLAS_INCLUDE_DIR
        OpenBLAS_LIB
        OpenBLAS
)

find_package(BLAS REQUIRED)
if(BLAS_FOUND)
    message(WARNING "BLAS FOUND")
    link_directories(${OpenBLAS_LIB})
    #link_directories(/usr/lib64/libopenblas.so)
    message(WARNING ${BLAS_LIBRARIES} "  asd " ${OpenBLAS_LIB} " asdfasd " ${OpenBLAS_INCLUDE_DIR})
    add_library(OpenBlas /usr/include/openblas/cblas.h)
else(BLAS_FOUND)
    message(FATAL_ERROR "BLAS NOT FOUND")
endif(BLAS_FOUND)

if(OpenBLAS_FOUND)
    message(WARNING "OpenBLAS FOUND")
    link_directories(${BLAS_LIBRARIES})
    #link_directories(/usr/lib64/libopenblas.so)
    message(WARNING ${OpenBLAS_FOUND} "  asd " ${BLA_VENDOR} )
    #add_library(OpenBlas /usr/include/openblas/cblas.h)
else(OpenBLAS_FOUND)
    message(FATAL_ERROR "BLAS NOT FOUND")
endif(OpenBLAS_FOUND)

find_package(LAPACK REQUIRED)
if(LAPACK_FOUND)
    message(WARNING "LAPACK FOUND")
    link_directories(${LAPACK_LIBRARIES})
    message(WARNING ${LAPACK_LIBRARIES})
else(LAPACK_FOUND)
    message(FATAL_ERROR "LAPACK NOT FOUND")
endif(LAPACK_FOUND)


set(SOURCE_FILES ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${OpenBLAS_INCLUDE_DIR} main.cpp MatrixMarket/mmio.c MatrixMarket/iohb.c )
add_executable(Matrix_Benchmark  ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${OpenBLAS_INCLUDE_DIR} ${SOURCE_FILES})

if(BLAS_FOUND)
    target_link_libraries (Matrix_Benchmark ${BLAS_LIBRARIES})
endif(BLAS_FOUND)

if(LAPACK_FOUND)
    target_link_libraries ( Matrix_Benchmark ${LAPACK_LIBRARIES})
endif(LAPACK_FOUND)

# copy data folder to build (not working, have to fix it) 
file(GLOB dataFiles "${CMAKE_CURRENT_BINARY_DIR}/data/")
#file( GLOB_RECURSE dataFiles RELATIVE "${CMAKE_CURRENT_BINARY_DIR}" "data/*.*)
#file( GLOB_RECURSE pattern_files RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/" "patterns/*.vti" )
#add_custom_target(copy)
foreach(dataFile ${dataFiles})
    message(WARNING "ASDASDASD")
    message(WARNING ${dataFolder})
    #set (dest "${PROJECT_BINARY_DIR}/${copyDataFiles}")
    #SET (dest2 "${CMAKE_CURRENT_BINARY_DIR}/${copyDataFiles}")
    message(WARNING " Copying ${dest}")
    add_custom_command(
            TARGET dataFile POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E
            copy ${CMAKE_CURRENT_BINARY_DIR}/${dataFiles} ${CMAKE_SOURCE_DIR}/data/
    )
    #SET (dest2 "${CMAKE_CURRENT_BINARY_DIR}/${copyDataFiles}")
    #MESSAGE(STATUS " Copying ${dest2}")
endforeach(dataFile)
我还有这个include指令,用于cblas.h处理C和C++

#ifdef __cplusplus
extern "C"
{
#endif
    #include <openblas/cblas.h>
#ifdef __cplusplus
}
#endif
\ifdef\uuucplusplus
外部“C”
{
#恩迪夫
#包括
#ifdef_uucplusplus
}
#恩迪夫
好,修复了它

我不想在CMake文件中包含OpenBlas lib,出于某些原因,我不得不删除所有Blas、OpenBlas、Lapack软件包并重新安装。出于某种原因,我不得不重新启动系统使其正常工作。这是strage,但谁知道发生了什么

现在,CMake文件看起来像

    cmake_minimum_required(VERSION 3.5)
#set( CMAKE_VERBOSE_MAKEFILE on )
set( CMAKE_VERBOSE_MAKEFILE off )
project(Matrix_Benchmark)

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Werror -Wfatal-errors -Wall -O2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wfatal-errors -Wall -O2")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wfatal-errors -Wall -O2")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")

#https://github.com/BVLC/caffe/blob/master/cmake/Modules/FindOpenBLAS.cmake
SET(Open_BLAS_INCLUDE_SEARCH_PATHS
        /usr/include
        /usr/include/openblas
        /usr/include/openblas-base
        /usr/local/include
        /usr/local/include/openblas
        /usr/local/include/openblas-base
        /opt/OpenBLAS/include
        $ENV{OpenBLAS_HOME}
        $ENV{OpenBLAS_HOME}/include
        )

SET(Open_BLAS_LIB_SEARCH_PATHS
        /lib/
        /lib/openblas-base
        /lib64/
        /usr/lib
        /usr/lib/openblas-base
        /usr/lib64
        /usr/local/lib
        /usr/local/lib64
        /opt/OpenBLAS/lib
        $ENV{OpenBLAS}cd
        $ENV{OpenBLAS}/lib
        $ENV{OpenBLAS_HOME}
        $ENV{OpenBLAS_HOME}/lib
        )

FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Open_BLAS_INCLUDE_SEARCH_PATHS})
FIND_LIBRARY(OpenBLAS_LIB NAMES openblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS})

SET(OpenBLAS_FOUND ON)

#    Check include files
IF(NOT OpenBLAS_INCLUDE_DIR)
    SET(OpenBLAS_FOUND OFF)
    MESSAGE(STATUS "Could not find OpenBLAS include. Turning OpenBLAS_FOUND off")
ENDIF()

#    Check libraries
IF(NOT OpenBLAS_LIB)
    SET(OpenBLAS_FOUND OFF)
    MESSAGE(STATUS "Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off")
ENDIF()

IF (OpenBLAS_FOUND)
    IF (NOT OpenBLAS_FIND_QUIETLY)
        MESSAGE(STATUS "Found OpenBLAS libraries: ${OpenBLAS_LIB}")
        MESSAGE(STATUS "Found OpenBLAS include: ${OpenBLAS_INCLUDE_DIR}")
    ENDIF (NOT OpenBLAS_FIND_QUIETLY)
ELSE (OpenBLAS_FOUND)
    IF (OpenBLAS_FIND_REQUIRED)
        MESSAGE(FATAL_ERROR "Could not find OpenBLAS")
    ENDIF (OpenBLAS_FIND_REQUIRED)
ENDIF (OpenBLAS_FOUND)

MARK_AS_ADVANCED(
        OpenBLAS_INCLUDE_DIR
        OpenBLAS_LIB
        OpenBLAS
)

find_package(BLAS REQUIRED)
if(BLAS_FOUND)
    message(WARNING "BLAS_LIB FOUND at " ${BLAS_LIBRARIES} " include files " )
    link_directories(${BLAS_LIBRARIES})
else(BLAS_FOUND)
    message(FATAL_ERROR "BLAS NOT FOUND")
endif(BLAS_FOUND)

if(OpenBLAS_FOUND)
    message(WARNING "OpenBLAS_LIB FOUND at " ${OpenBLAS_LIB} ", include files " ${OpenBLAS_INCLUDE_DIR})
    link_directories(${OpenBLAS_LIB})
    #add_library(${OpenBLAS_INCLUDE_DIR})
else(OpenBLAS_FOUND)
    message(FATAL_ERROR "OpenBLAS_FOUND NOT FOUND")
endif(OpenBLAS_FOUND)

find_package(LAPACK REQUIRED)
if(LAPACK_FOUND)
    message(WARNING "LAPACK_LIB FOUND at " ${LAPACK_LIBRARIES} ", include files " )
    link_directories(${LAPACK_LIBRARIES})
else(LAPACK_FOUND)
    message(FATAL_ERROR "LAPACK NOT FOUND")
endif(LAPACK_FOUND)

set(SOURCE_FILES ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${OpenBLAS_INCLUDE_DIR} main.cpp MatrixMarket/mmio.c MatrixMarket/iohb.c )
add_executable(Matrix_Benchmark  ${BLAS_LIBRARIES} ${LAPACK_LIBRARIES} ${OpenBLAS_LIB} ${SOURCE_FILES})

if(BLAS_FOUND)
    target_link_libraries (Matrix_Benchmark ${BLAS_LIBRARIES})
endif(BLAS_FOUND)

if(OpenBLAS_FOUND)
    target_link_libraries (Matrix_Benchmark ${OpenBLAS_LIB})
endif(OpenBLAS_FOUND)

if(LAPACK_FOUND)
    target_link_libraries ( Matrix_Benchmark ${LAPACK_LIBRARIES})
endif(LAPACK_FOUND)

# copy data folder to build
file(GLOB dataFiles "${CMAKE_CURRENT_BINARY_DIR}/data/")
#file( GLOB_RECURSE dataFiles RELATIVE "${CMAKE_CURRENT_BINARY_DIR}" "data/*.*)
#file( GLOB_RECURSE pattern_files RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/" "patterns/*.vti" )
#add_custom_target(copy)
foreach(dataFile ${dataFiles})
    message(WARNING "ASDASDASD")
    message(WARNING ${dataFolder})
    #set (dest "${PROJECT_BINARY_DIR}/${copyDataFiles}")
    #SET (dest2 "${CMAKE_CURRENT_BINARY_DIR}/${copyDataFiles}")
    message(WARNING " Copying ${dest}")
    add_custom_command(
            TARGET dataFile POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E
            copy ${CMAKE_CURRENT_BINARY_DIR}/${dataFiles} ${CMAKE_SOURCE_DIR}/data/
    )
    #SET (dest2 "${CMAKE_CURRENT_BINARY_DIR}/${copyDataFiles}")
    #MESSAGE(STATUS " Copying ${dest2}")
endforeach(dataFile)