I trying to use CSDP which is a mathematical library for SDP. I download the library an extract the lib (libsdp.a). It is using lapack and blas lib, so I add -lblas and -llapack options.
I want to compile with cmake, hier is my CmakeList file (I comment a lot of line, I just want to test the compilation of example.c with is an example given by CSDP) :
# 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)
#./
The problem is, I think that libsdp.a need library (blas, lapack and math) but, even if I add it in my Cmake, he don't succeed to find it :
[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
add_definitions
adds definitions for compiler, but-l
is an option for linker. You need to use target_link_libraries. – Tsyvarev