2016-02-14 288 views
0

我試圖使用CSDP這是SDP的數學庫。 我下載了一個庫lib(libsdp.a)。它使用lapack和blas lib,所以我添加了-lblas和-llapack選項。使用cmake編譯CSDP

我想cmake的編譯,票數是我CmakeList文件(我評論了很多線,我只是想測試example.c的編制與是複方丹蔘滴丸給出的例子):

# Cette commande non obligatoire est fortement conseillée. 
cmake_minimum_required (VERSION 2.6) 

# Déclaration du projet. 
# Les fichiers CMakeLists pourront référer à la racine du projet par la variable 
# ${ECMA_SOURCE_DIR} et ${ECMA_BINARY_DIR} 
project(projet_ECMA) 
set(EXE run) 

# L'exécutable sera rangé différemment en fonction de la plateformee. 
# Par défaut le binaire est construit dans le répertoire courant (?) 
# set(EXECUTABLE_OUTPUT_PATH ../bin) 
# set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE}) 

#  SET (CMAKE_C_COMPILER    "/usr/bin/clang") 
#  SET (CMAKE_C_FLAGS    "-Wall -std=c99") 
#  SET (CMAKE_C_FLAGS_DEBUG   "-g++") 
#  SET (CMAKE_C_FLAGS_MINSIZEREL  "-Os -DNDEBUG") 
#  SET (CMAKE_C_FLAGS_RELEASE  "-O4 -DNDEBUG") 
#  SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") 
# 
#  SET (CMAKE_CXX_COMPILER    "/usr/bin/clang++") 
#  SET (CMAKE_CXX_FLAGS    "-Wall") 
#  SET (CMAKE_CXX_FLAGS_DEBUG   "-g") 
#  SET (CMAKE_CXX_FLAGS_MINSIZEREL  "-Os -DNDEBUG") 
#  SET (CMAKE_CXX_FLAGS_RELEASE  "-O4 -DNDEBUG") 
#  SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") 
# 
#  SET (CMAKE_AR  "/usr/bin/llvm-ar") 
#  SET (CMAKE_LINKER "/usr/bin/llvm-ld") 
#  SET (CMAKE_NM  "/usr/bin/llvm-nm") 
#  SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump") 
#  SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib") 

#set(CSDP_DIR "/home/hassan/Bureau/ECMA/projet_ECMA/trunk/lib/libsdp.a") 
#find_package(CSDP REQUIRED) 
SET (BLAS "/usr/lib/libcblas.a") 
SET (LAPACK "/usr/lib/liblapack.a") 
SET (CSDP "/home/hassan/Bureau/ECMA/projet_ECMA/trunk/lib/libsdp.a") 
# Les options de compilation 
# add_definitions(-Wall -Wextra -ansi -O2 -Wwrite-strings 
#     -Wuninitialized -Wno-missing-braces 
#     -Wno-missing-field-initializers) 
add_definitions(
    # -Wno-unused-private-field # Pour inhiber un warning de cplex 12.4 
# -m64 
# -g 
# -fPIC 
# -fexceptions 
# -pg 
# -DNDEBUG 
# -DIL_STD # Pour cplex en C++ 
# -std=c++11 
# -o 
    -O3 
# -pthread 
    #-L/home/hassan/Bureau/ECMA/projet_ECMA/trunk/lib  
    -ansi 
    -Wall 
    -DNOSHORTS 
    -DUSEGETTIME 
# -lsdp 

-lsdp -llapack 
-latlas 
    -lcblas 
    -lgfortran 
    -lm 
-lg2c 
-lctmg -lf2c 

) 

# Config spécifique à un système 
# - UNIX vrai sous une plateforme Unix (don macosx) 
# - APPLE vrai pour un os apple (donc macosx !) 
# - WIN32 : vrai sous Windows (32 et 64bit !) 
if(APPLE) 
    message("=> Détection système Apple") 
    set(CMAKE_EXE_LINKER_FLAGS "-Wl,-no_compact_unwind") 
endif() 


# file(
#  GLOB 
#  srcs 
#  src/*.cpp 
#  src/*.cc 
#  src/*.c 
#  src/*.hh 
#  src/*.h 
#) 

# On définit la liste des tous les fichiers sources (dont les includes) 
# cmale se débrouillera pour trouver le main() et les dépendances. 
# On peut préciser des sous-répertoires, des groupes de fichiers, ... 
# Mais ATTENTION aux fichiers inutilisés : ils seront compiler et peuvent 
# provoquer des erreurs. Il peut donc être référable de préciser exactement les 
# fichiers sources 
file(
    GLOB 
    srcs 
    # src/site.* 
    # src/station.* 
    # src/remorque.* 
    # src/arc.* 
    # src/util.* 
    # src/logger.* 
    # src/options.* 
    # src/bench.* 
    # src/*Solver.* 
    # src/solver.* 
    # src/cir.* 
    # src/solu.* 
    # src/main.* 
# src/*hpp 
# /home/hassan/Bureau/ECMA/projet_ECMA/trunk/include/*.* 
# src/*cpp 
    src/*.cc 
    src/*.hh 
    src/example.c 
    src/*.h 
    # src/*.* 
) 

# Le ou les exécutables à générer 
add_executable(${EXE} ${srcs}) 

# Les répertoire ou chercher vos includes (ou ceux de cplex, ...) 
include_directories(
    # ${PROJECT_SOURCE_DIR} 
    # ${PROJECT_BINARY_DIR} 
    #$ENV{CONCERT_INCLUDE_DIR} 
    $ENV{CSDP_INCLUDE} 
    #$ENV{CPOPTIMIZER_INCLUDE_DIR} 
    #$ENV{CPLEX_INCLUDE_DIR} 
    # $ENV{LEMON_INCLUDE} 
    #$ENV{CPOPTIM_INCLUDE_DIR} 
    # $ENV{GLPK_INCLUDE} 
) 

# Ajouter ici les répertoires de vos bib. dynamiques utilisées 
# 

link_directories(
    # ${PROJECT_BINARY_DIR}/lemon 
    # $ENV{LEMON_LIB} 
    # $ENV{GLPK_LIB} 
    $ENV{CSDP_LIB} 
# $ENV{CONCERT_LIB_DIR} 
# $ENV{CPLEX_LIB_DIR} 
) 

#find_library(CPLEX cplex HINTS $ENV{CPLEX_LIB_DIR}) 
#find_library(ILO_CPLEX ilocplex HINTS $ENV{CPLEX_LIB_DIR}) 
#find_library(CPOTIMIZER cpoptimizer HINTS $ENV{CPOPTIMIZER_LIB_DIR}) 
#find_library(CONCERT concert HINTS $ENV{CONCERT_LIB_DIR}) 
find_library(CSDP sdp HINTS $ENV{CSDP_LIB}) 

# Ajouter ici les bibliothèques dynamiques que vous utilisez 
# 
target_link_libraries(${EXE} blas) # pour programmation multithead 
target_link_libraries(${EXE} lapack) # pour programmation multithead 
#target_link_libraries(${EXE} sdp) # pour programmation multithead 
target_link_libraries(${EXE} pthread) # pour programmation multithead 
target_link_libraries(${EXE} m)  # lib mathématique 
target_link_libraries(${EXE} ${ILO_CPLEX}) # spécial cplex 
target_link_libraries(${EXE} ${CPLEX}) # spécial cplex 
target_link_libraries(${EXE} ${CPOPTIMIZER}) # spécial cplex 
target_link_libraries(${EXE} ${CONCERT}) # spécial cplex 
message("=> CSDP  is ${CONCERT}") 
#target_link_libraries(${EXE} ${BLAS}) # spécial csdp 
#target_link_libraries(${EXE} ${LAPACK}) # spécial csdp 
target_link_libraries(${EXE} ${CSDP}) # spécial csdp 

#target_link_libraries(${EXE} ${BLAS}) # spécial csdp 
# target_link_libraries(${EXE} emon) # lib de graphe 
# target_link_libraries(${EXE} glpk) # solveur PLNE gratuit 




# La liste des exécutables mono-fichiers à compiler 
## set(demo_srcs 
##  main.cc 
##  test1.cc 
##  test2.cc 
##) 
# file(GLOB demo_srcs src/*.cc) 


## foreach(demo_src ${demo_srcs}) 
##  get_filename_component(demo_name ${demo_src} NAME_WE) 
##  message("=> demo_src=${demo_src}") 
##  message("=> demo_name=${demo_name}") 
##  add_executable(${demo_name} ${demo_src}) 
##  target_link_libraries(${demo_name} emon) 
## endforeach() 

# Quelques messages précisant la configuration utilisée 
# 
message("=> CSDP_INCLUDE  is $ENV{CSDP_INCLUDE}") 
message("=> CSDP_LIB  is $ENV{CSDP_LIB}") 
message("=> ILOG_CPLEX_INCLUDE  is $ENV{CPLEX_INCLUDE_DIR}") 
message("=> ILOG_CPLEX_LIB   is $ENV{CPLEX_LIB_DIR}") 
message("=> ILOG_CONCERT_INCLUDE is $ENV{CONCERT_INCLUDE_DIR}") 
message("=> ILOG_CONCERT_LIB  is $ENV{CONCERT_LIB_DIR}") 
# message("=> LEMON_INCLUDE   is $ENV{LEMON_INCLUDE}") 
# message("=> LEMON_LIB    is $ENV{LEMON_LIB}") 
# message("=> GLPK_INCLUDE   is $ENV{GLPK_INCLUDE}") 
# message("=> GLPK_LIB    is $ENV{GLPK_LIB}") 
message("=> srcs     is ${srcs}") 
# Ceci affiche 8 sur un machine 64 bits ou 4 sur un machine 32 bit 
message("=> CMAKE_SIZEOF_VOID_P is ${CMAKE_SIZEOF_VOID_P}") 
message("\n") 



# 
# Complément pour ajouter quelques cibles personnalisées dans le Makefile généré 
# 
EXECUTE_PROCESS(
    COMMAND date +%Y%m%d-%Hh%M 
    OUTPUT_VARIABLE date_stamp 
    OUTPUT_STRIP_TRAILING_WHITESPACE 
) 
GET_FILENAME_COMPONENT(project_dir_name ${CMAKE_SOURCE_DIR} NAME) 


# On peut compléter les cible du Makefile généré 
# (la comande finale de cette ciblesera ajoutée à CMakeFiles/Makefile2) 
# (puis Essayer de créer un cmake tbz !!) 
ADD_CUSTOM_TARGET(distclean 
    COMMAND @echo Nettoyage complet des sources 
    COMMAND @echo \"Répertoire courant = `pwd`\" 
    COMMAND @echo "CMAKE_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}" 
    # COMMAND make clean 
    COMMAND find ${CMAKE_CURRENT_BINARY_DIR} -name "CMakeCache.txt" | xargs rm -rf 
    COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/* 
) 
ADD_CUSTOM_TARGET(dc 
    COMMAND make distclean 
) 
ADD_CUSTOM_TARGET(cc 
    COMMAND make distclean 
) 
ADD_CUSTOM_TARGET(c 
    COMMAND make clean 
) 
# Attention : cette commande construit une cible pour le Makefile. 
# Il faut protéger les double-quote si l'on veux qu'elles ne soient pas consommées 
# par cmake mais passée au Makefile. 
# Un seul COMMENT par cible semble-t-il 
ADD_CUSTOM_TARGET(tbz 
    COMMENT "Création d'une archive datée du projet" 
    COMMAND @echo \" => duplication du projet en : ${project_dir_name}-${date_stamp}\" 
    COMMAND cp -Rp ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}-${date_stamp} 
    COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp}/build/ 
    COMMAND mkdir -p ${CMAKE_SOURCE_DIR}-${date_stamp}/build/ 
    # tar -C newDir : pour se placer dans le répertoire parent de l'archive 
    COMMAND tar cjf ${CMAKE_SOURCE_DIR}-${date_stamp}.tbz 
        -C ${CMAKE_SOURCE_DIR}/.. 
        ${project_dir_name}-${date_stamp} 
    COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp} 
    COMMAND @echo \" => Archive faite : ${project_dir_name}-${date_stamp}.tbz\" 
) 
ADD_CUSTOM_TARGET(txz 
    COMMENT "Création d'une archive datée du projet (TEST XZ)" 
    COMMAND @echo \" => duplication du projet en : ${project_dir_name}-${date_stamp}\" 
    COMMAND cp -Rp ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}-${date_stamp} 
    COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp}/build/ 
    COMMAND mkdir -p ${CMAKE_SOURCE_DIR}-${date_stamp}/build/ 
    # tar -C newDir : pour se placer dans le répertoire parent de l'archive 
    COMMAND tar cf ${CMAKE_SOURCE_DIR}-${date_stamp}.tar 
        -C ${CMAKE_SOURCE_DIR}/.. 
        ${project_dir_name}-${date_stamp} 
    COMMAND xz ${CMAKE_SOURCE_DIR}-${date_stamp}.tar 
    COMMAND mv ${CMAKE_SOURCE_DIR}-${date_stamp}.tar.xz ${CMAKE_SOURCE_DIR}-${date_stamp}.txz 
    COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp} 
    COMMAND @echo \" => Archive faite : ${project_dir_name}-${date_stamp}.tbz\" 
) 
# ADD_CUSTOM_TARGET(zip 
#  COMMENT "Création d'une archive datée du proje (TEST ZIP°t" 
#  COMMAND @echo \" => duplication du projet en : ${project_dir_name}-${date_stamp}\" 
#  COMMAND cp -Rp ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}-${date_stamp} 
#  COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp}/build/ 
#  COMMAND mkdir -p ${CMAKE_SOURCE_DIR}-${date_stamp}/build/ 
#  COMMAND echo \"1: CMAKE_SOURCE_DIR-date_stamp==1==${CMAKE_SOURCE_DIR}-${date_stamp}\" 
#  COMMAND echo \"2: project_dir_name-date_stamp==2==${project_dir_name}-${date_stamp}\" 
#  # tar -C newDir : pour se placer dans le répertoire parent de l'archive 
#  # COMMAND '_pwd=`pwd`' 
#  # COMMAND pushd ${CMAKE_SOURCE_DIR}/.. 
#  COMMAND echo 'pushd; zip -r -v -y -o -9 ${CMAKE_SOURCE_DIR}-${date_stamp}.zip \ 
#      ${project_dir_name}-${date_stamp} ; popd' 
#  COMMAND sh -c "pushd; zip -r -v -y -o -9 ${CMAKE_SOURCE_DIR}-${date_stamp}.zip \ 
#      ${project_dir_name}-${date_stamp} ; popd" 
#  # COMMAND zip -r -v -y -o -9 ${CMAKE_SOURCE_DIR}-${date_stamp}.zip 
#  #     ${project_dir_name}-${date_stamp} 
#  COMMAND 'cd $_pwd' 
#  # COMMAND popd 
#  COMMAND rm -r ${CMAKE_SOURCE_DIR}-${date_stamp} 
#  COMMAND @echo \" => Archive faite : ${project_dir_name}-${date_stamp}.tbz\" 
#) 

INCLUDE(InstallRequiredSystemLibraries) 
IF(WIN32 AND NOT UNIX) 
    SET(CPACK_NSIS_MODIFY_PATH ON) 
ENDIF(WIN32 AND NOT UNIX) 

INCLUDE(CPack) 

#./ 

問題是,我認爲libsdp.a需要庫(BLAS,LAPACK和數學),但是,即使我添加它在我的CMake的,他沒有成功找到它:

[100%] Building C object CMakeFiles/run.dir/src/example.c.o 
/usr/bin/cc -DNOSHORTS -DUSEGETTIME -I/home/hassan/Bureau/ECMA/projet_ECMA/trunk/include -O3 -ansi -Wall -lsdp -llapack -latlas -lcblas -lgfortran -lm -lg2c -lctmg -lf2c -o CMakeFiles/run.dir/src/example.c.o -c /home/hassan/Bureau/ECMA/projet_ECMA/src/example.c 
/home/hassan/Bureau/ECMA/projet_ECMA/src/example.c: In function ‘main’: 
/home/hassan/Bureau/ECMA/projet_ECMA/src/example.c:62:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=] 
    printf("%d \n", sqrt(2)); 
^
Linking C executable run 
/usr/bin/cmake -E cmake_link_script CMakeFiles/run.dir/link.txt --verbose=1 
/usr/bin/cc  CMakeFiles/run.dir/src/example.c.o -o run -rdynamic -lblas -llapack -lpthread -lm trunk/lib/libsdp.a 
trunk/lib/libsdp.a(initsoln.o): dans la fonction « initsoln »: 
initsoln.c:(.text+0x2a9): référence indéfinie vers « sqrt » 
initsoln.c:(.text+0x2ed): référence indéfinie vers « sqrt » 
initsoln.c:(.text+0x334): référence indéfinie vers « sqrt » 
trunk/lib/libsdp.a(norms.o): dans la fonction « norm2 »: 
norms.c:(.text+0x1d): référence indéfinie vers « dnrm2_ » 
trunk/lib/libsdp.a(norms.o): dans la fonction « norm1 »: 
norms.c:(.text+0x4d): référence indéfinie vers « dasum_ » 
trunk/lib/libsdp.a(norms.o): dans la fonction « norminf »: 
norms.c:(.text+0x81): référence indéfinie vers « idamax_ » 
trunk/lib/libsdp.a(sdp.o): dans la fonction « sdp »: 
sdp.c:(.text+0x1ed7): référence indéfinie vers « dpotrf_ » 
sdp.c:(.text+0x2104): référence indéfinie vers « pow » 
sdp.c:(.text+0x7cf3): référence indéfinie vers « sqrt » 
sdp.c:(.text+0x8651): référence indéfinie vers « sqrt » 
sdp.c:(.text+0x88eb): référence indéfinie vers « sqrt » 
sdp.c:(.text+0x88f5): référence indéfinie vers « sqrt » 
sdp.c:(.text+0x8968): référence indéfinie vers « pow » 
sdp.c:(.text+0x89bd): référence indéfinie vers « sqrt » 
sdp.c:(.text+0x89e9): référence indéfinie vers « sqrt » 
trunk/lib/libsdp.a(Fnorm.o): dans la fonction « Fnorm »: 
Fnorm.c:(.text+0xcb): référence indéfinie vers « sqrt » 
trunk/lib/libsdp.a(calc_dobj.o): dans la fonction « calc_dobj »: 
calc_dobj.c:(.text+0x2d): référence indéfinie vers « ddot_ » 
trunk/lib/libsdp.a(mat_mult.o): dans la fonction « mat_mult »: 
mat_mult.c:(.text+0xef): référence indéfinie vers « dgemm_ » 
trunk/lib/libsdp.a(mat_mult.o): dans la fonction « mat_mult_raw »: 
mat_mult.c:(.text+0x479): référence indéfinie vers « dgemm_ » 
trunk/lib/libsdp.a(solvesys.o): dans la fonction « solvesys »: 
solvesys.c:(.text+0x40): référence indéfinie vers « dpotrs_ » 
trunk/lib/libsdp.a(linesearch.o): dans la fonction « linesearch »: 
linesearch.c:(.text+0x39f): référence indéfinie vers « dgemv_ » 
linesearch.c:(.text+0x416): référence indéfinie vers « dgemv_ » 
linesearch.c:(.text+0x488): référence indéfinie vers « dgemv_ » 
linesearch.c:(.text+0x4ff): référence indéfinie vers « dgemv_ » 
linesearch.c:(.text+0xe2b): référence indéfinie vers « sqrt » 
trunk/lib/libsdp.a(matvec.o): dans la fonction « matvec »: 
matvec.c:(.text+0xb8): référence indéfinie vers « dgemv_ » 
trunk/lib/libsdp.a(chol.o): dans la fonction « chol_blk »: 
chol.c:(.text+0x36): référence indéfinie vers « dpotrf_ » 
trunk/lib/libsdp.a(chol.o): dans la fonction « chol_diag »: 
chol.c:(.text+0x134): référence indéfinie vers « sqrt » 
trunk/lib/libsdp.a(chol.o): dans la fonction « chol »: 
chol.c:(.text+0x1bd): référence indéfinie vers « dpotrf_ » 
chol.c:(.text+0x2e1): référence indéfinie vers « sqrt » 
trunk/lib/libsdp.a(chol.o): dans la fonction « chol_inv »: 
chol.c:(.text+0x42f): référence indéfinie vers « dtrtri_ » 
trunk/lib/libsdp.a(qreig.o): dans la fonction « qreig »: 
qreig.c:(.text+0x539): référence indéfinie vers « sqrt » 
qreig.c:(.text+0x64f): référence indéfinie vers « sqrt » 
qreig.c:(.text+0x718): référence indéfinie vers « sqrt » 
collect2: error: ld returned 1 exit status 
make[2]: *** [run] Erreur 1 
+0

(我的殼是法語,但「參照indéfinieVERS」大概是「未定義的引用」) – razzi

+0

'add_definitions'爲**編譯器**添加了定義,但'-l'是**鏈接器**的一個選項。您需要使用[target_link_libraries](https://cmake.org/cmake/help/v3.0/command/target_link_libraries.html)。 – Tsyvarev

+0

與http://stackoverflow.com/q/10409032/3378179相同的錯誤? – Caduchon

回答

0

不是一個真正的回答。這是我的CMake文件,包括用blas/lapack構建,如果它可以幫助你的話。它需要以下變量:DefaultLapackPath,CompilerName(小寫)和cpp文件GetLapackVersion.cpp在由${CMAKE_MODULES_DIR}(見下文)給出的目錄中。

文件LoadLapack.cmake

set(LapackPath "${DefaultLapackPath}" CACHE PATH "Path to Lapack installation") 
if(NOT "${LapackPath}" STREQUAL "${LapackPath_copy}") 
    unset(LibBlas CACHE) 
    unset(LibLapack CACHE) 
    set(LapackPath_copy "${LapackPath}" CACHE INTERNAL "") 
endif() 
message(STATUS "Path to Lapack: ${LapackPath}") 

set(Lapack_LIBRARY_DIRS ${LapackPath}/lib) 
find_library(LibBlas blas PATHS ${Lapack_LIBRARY_DIRS} DOC "Complete path to blas library" NO_DEFAULT_PATH) 
find_library(LibLapack lapack PATHS ${Lapack_LIBRARY_DIRS} DOC "Complete path to lapack library" NO_DEFAULT_PATH) 
if(EXISTS "${LibBlas}" AND EXISTS "${LibLapack}") 
    message(STATUS "Lapack libraries found !") 
else() 
    message(SEND_ERROR "Lapack libraries not found...") 
endif() 

if(CompilerName STREQUAL "gcc") 
    set(Fortran_LIBRARIES gfortran) 
endif() 
set(Lapack_LIBRARIES lapack blas) 

set(NAME_MANGLING_OPTIONS 
    "NameManglingUpper" 
    "NameManglingLower" 
    "NameManglingUBack" 
    "NameMangling2UBack" 
    "NameManglingUFront" 
    "NameMangling2UFront") 
set(LAPACK_NAME_MANGLING "") 
foreach(NAME_MANGLING_OPTION IN LISTS NAME_MANGLING_OPTIONS) 
    set(LAPACK_NAME_MANGLING "${NAME_MANGLING_OPTION}") 
    set(TRY_MANGLING_LIBRARY_DIRS ${Lapack_LIBRARY_DIRS} ${Compiler_LIBRARY_DIRS}) 
    set(TRY_MANGLING_LIBRARIES ${Lapack_LIBRARIES} ${Fortran_LIBRARIES}) 
    try_compile(TRY_MANGLING_OPTION ${CMAKE_BINARY_DIR}/tmpLapack ${CMAKE_MODULES_DIR}/GetLapackVersion.cpp 
       CMAKE_FLAGS "-DLINK_DIRECTORIES=${TRY_MANGLING_LIBRARY_DIRS}" "-DLINK_LIBRARIES=${TRY_MANGLING_LIBRARIES}" 
       COMPILE_DEFINITIONS "-DLapack${NAME_MANGLING_OPTION}") 
    if(TRY_MANGLING_OPTION) 
     set(LAPACK_NAME_MANGLING "Lapack${NAME_MANGLING_OPTION}") 
     break() 
    endif() 
endforeach() 
if(LAPACK_NAME_MANGLING STREQUAL "") 
    message(SEND_ERROR "Impossible to detect Fortran name mangling...") 
else() 
    message(STATUS "Lapack: detected Fortran name mangling: ${LAPACK_NAME_MANGLING}") 
    add_definitions("-D${LAPACK_NAME_MANGLING}") 
endif() 

set(GET_LAPACK_VERSION_LIBRARY_DIRS ${Lapack_LIBRARY_DIRS} ${Compiler_LIBRARY_DIRS}) 
set(GET_LAPACK_VERSION_LIBRARIES ${Lapack_LIBRARIES} ${Fortran_LIBRARIES}) 
try_run(GET_LAPACK_VERSION_RUN GET_LAPACK_VERSION_COMPILE ${CMAKE_BINARY_DIR}/tmpLapack ${CMAKE_MODULES_DIR}/GetLapackVersion.cpp 
     CMAKE_FLAGS "-DLINK_DIRECTORIES=${GET_LAPACK_VERSION_LIBRARY_DIRS}" "-DLINK_LIBRARIES=${GET_LAPACK_VERSION_LIBRARIES}" 
     COMPILE_DEFINITIONS "-D${LAPACK_NAME_MANGLING}" 
     COMPILE_OUTPUT_VARIABLE GET_LAPACK_VERSION_COMPILE_OUT RUN_OUTPUT_VARIABLE GET_LAPACK_VERSION_RUN_OUT) 
if(NOT GET_LAPACK_VERSION_COMPILE) 
    message(SEND_ERROR "Impossible to compile the file \"${CMAKE_MODULES_DIR}/GetLapackVersion.cpp\". Output: ${GET_LAPACK_VERSION_COMPILE_OUT}") 
elseif(NOT GET_LAPACK_VERSION_RUN_OUT MATCHES "^[0-9]+.[0-9]+.[0-9]+") 
    message(SEND_ERROR "Error while running GetLapackVersion:${GET_LAPACK_VERSION_RUN_OUT}XXX") 
else() 
    string(STRIP "${GET_LAPACK_VERSION_RUN_OUT}" LapackVersion) 
    if(LapackVersion VERSION_LESS "${RequiredLapackVersion}") 
     message(SEND_ERROR "The version of Lapack (${LapackVersion}) is too old") 
    else() 
     message(STATUS "Lapack version: ${LapackVersion}") 
    endif() 
endif() 

mark_as_advanced(LibBlas FORCE) 
mark_as_advanced(LibLapack FORCE) 

文件GetLapackVersion.cpp

#include <iostream> 
#if defined LapackNameManglingUpper 
    #define ilaver ILAVER 
#elif defined LapackNameManglingLower 
    #define ilaver ilaver 
#elif defined LapackNameManglingUBack 
    #define ilaver ilaver_ 
#elif defined LapackNameMangling2UBack 
    #define ilaver ilaver__ 
#elif defined LapackNameManglingUFront 
    #define ilaver _ilaver 
#elif defined LapackNameMangling2UFront 
    #define ilaver __ilaver 
#endif 
extern "C" { void ilaver(int* major, int* minor, int* patch); } 
int main() 
{ 
    int major = 0; int minor = 0; int patch = 0; 
    ilaver(&major, &minor, &patch); 
    std::cout << major << "." << minor << "." << patch << std::endl; 
    return 0; 
} 

然後我定義我的BLAS/LAPACK頭文件那樣:

文件blas.h

#ifndef _INCLUDED__BLAS_H_ 
#define _INCLUDED__BLAS_H_ 
#if defined LapackNameManglingUpper 
# define dgemm DGEMM 
# define dsymm DSYMM 
# define dtrmm DTRMM 
#elif defined LapackNameManglingLower 
# define dgemm dgemm 
# define dsymm dsymm 
# define dtrmm dtrmm 
#elif defined LapackNameManglingUBack 
# define dgemm dgemm_ 
# define dsymm dsymm_ 
# define dtrmm dtrmm_ 
#elif defined LapackNameMangling2UBack 
# define dgemm dgemm__ 
# define dsymm dsymm__ 
# define dtrmm dtrmm__ 
#elif defined LapackNameManglingUFront 
# define dgemm _dgemm 
# define dsymm _dsymm 
# define dtrmm _dtrmm 
#elif defined LapackNameMangling2UFront 
# define dgemm __dgemm 
# define dsymm __dsymm 
# define dtrmm __dtrmm 
#endif 
namespace blas 
{ 
    extern "C" 
    { 
     void dgemm(char* transa, char* transb, int* m, int* n, int* k, double* alpha, double* A, int* lda, double* B, int* ldb, double* beta, double* C, int* ldc); 
     void dsymm(char* side, char* uplo, int* m, int* n, double* alpha, double* A, int* lda, double* B, int* ldb, double* beta, double* C, int* ldc); 
     void dtrmm(char* side, char* uplo, char* transa, char* diag, int* m, int* n, double* alpha, double* A, int* lda, double* B, int* ldb); 
    } 
} 
#endif 

然後,我可以建立我的可執行文件用這種CMake的文件:

link_directories(${Lapack_LIBRARY_DIRS}) 
set(MyApp_UsedLib 
    ${Lapack_LIBRARIES} 
    ${Fortran_LIBRARIES} 
) 
add_executable(myapp my_app.cpp) 
target_link_libraries(myapp ${MyApp_UsedLib})