[C] Problema linking librerie MKL
Salve,
sto cercando di compilare dei programmi C che utilizzano le librerie intel mkl_cblas e mkl_lapacke, il problema è che durante la compilazione, il linker mi restituisce questi errori:
sembra che non trovi le librerie che gli passo; io compilo in questo modo:
ed all'interno del file ho i seguenti include:
grazie
sto cercando di compilare dei programmi C che utilizzano le librerie intel mkl_cblas e mkl_lapacke, il problema è che durante la compilazione, il linker mi restituisce questi errori:
/tmp/ccLyat4a.o: In function `armijo': lmsd_mkl.c:(.text+0x388a): undefined reference to `cblas_dnrm2' lmsd_mkl.c:(.text+0x3903): undefined reference to `cblas_daxpy' lmsd_mkl.c:(.text+0x3937): undefined reference to `cblas_dnrm2' lmsd_mkl.c:(.text+0x398b): undefined reference to `cblas_ddot' /tmp/ccLyat4a.o: In function `main': lmsd_mkl.c:(.text+0x4042): undefined reference to `cblas_dnrm2' lmsd_mkl.c:(.text+0x410c): undefined reference to `cblas_daxpy' lmsd_mkl.c:(.text+0x41c0): undefined reference to `cblas_dscal' lmsd_mkl.c:(.text+0x42ce): undefined reference to `cblas_dnrm2' lmsd_mkl.c:(.text+0x4300): undefined reference to `cblas_dnrm2' lmsd_mkl.c:(.text+0x4348): undefined reference to `cblas_dnrm2' lmsd_mkl.c:(.text+0x45cd): undefined reference to `cblas_dgemm' lmsd_mkl.c:(.text+0x45f4): undefined reference to `LAPACKE_dpotrf' lmsd_mkl.c:(.text+0x4847): undefined reference to `cblas_dgemv' lmsd_mkl.c:(.text+0x4892): undefined reference to `LAPACKE_dtrtrs' lmsd_mkl.c:(.text+0x49a8): undefined reference to `LAPACKE_dtrtri' lmsd_mkl.c:(.text+0x4a20): undefined reference to `cblas_dgemm' lmsd_mkl.c:(.text+0x4a92): undefined reference to `cblas_dgemm' lmsd_mkl.c:(.text+0x4b75): undefined reference to `LAPACKE_dsterf' collect2: error: ld returned 1 exit status
sembra che non trovi le librerie che gli passo; io compilo in questo modo:
gcc lmsd_mkl.c -o lmsd_mkl -lm -I/opt/intel/12.1.5/composer_xe_2011_sp1.11.339/mkl/include -L/opt/intel/12.1.5/composer_xe_2011_sp1.11.339/mkl/lib/intel64 -lmkl_core -lmkl_sequential -lmkl_intel_thread -ldl -lpthread
ed all'interno del file ho i seguenti include:
#include "/opt/intel/12.1.5/composer_xe_2011_sp1.11.339/mkl/include/mkl.h" #include "/opt/intel/12.1.5/composer_xe_2011_sp1.11.339/mkl/include/mkl_cblas.h" #include "/opt/intel/12.1.5/composer_xe_2011_sp1.11.339/mkl/include/mkl_lapacke.h"
grazie
Risposte
Non sono su linux in questo momento e usando principalmente icc per compilare con MKL devo controllare i comandi di compilazione specifica per gcc. Lo faccio più tardi.
Nel frattempo ti chiedo perché stai includendo il file specificando per intero il path se questo path è stato già aggiunto tra quelli presi in considerazione dal compilatore. Immagino comunque che il problema sia da ricercare nelle librerie che hai linkato. Probabilmente ne manca qualcuna. Esiste un tool online per aiutarti a trovare l'esatta linea di comando da usare qui.
Nel frattempo ti chiedo perché stai includendo il file specificando per intero il path se questo path è stato già aggiunto tra quelli presi in considerazione dal compilatore. Immagino comunque che il problema sia da ricercare nelle librerie che hai linkato. Probabilmente ne manca qualcuna. Esiste un tool online per aiutarti a trovare l'esatta linea di comando da usare qui.
grazie per la risposta,
per testare questi codici ho a disposizione un computer (non mio) che purtroppo non ha icc, o meglio è installato ma ci sono alcuni problemi con la licenza di utilizzo, quindi posso contare solo sul gcc.
Per quanto riguarda il path, purtroppo non ho mkl.h in /usr/include quindi dovrei includere i path assoluti.
Più tardi provo il tool online, grazie!
per testare questi codici ho a disposizione un computer (non mio) che purtroppo non ha icc, o meglio è installato ma ci sono alcuni problemi con la licenza di utilizzo, quindi posso contare solo sul gcc.
Per quanto riguarda il path, purtroppo non ho mkl.h in /usr/include quindi dovrei includere i path assoluti.
Più tardi provo il tool online, grazie!
apatriarca intendeva dire che una volta che specifichi
In linux dovresti avere il comando
Ad occhio direi che devi linkare una libreria mkl_cblas qualcosa.
-I/opt/intel/12.1.5/composer_xe_2011_sp1.11.339/mkl/includepuoi mettere semplicemente
#include "mkl.h"perché il compilatore va a cercare lì.
In linux dovresti avere il comando
nmche cerca i nomi definiti all'interno di una libreria, una cosa tipo
nm *.a ?? cblas_ddot.
Ad occhio direi che devi linkare una libreria mkl_cblas qualcosa.