2014-07-20 14 views
5

Please help me! Mi ci vogliono ore per cercare su internet e non ho trovato una soluzione ...errori usando l'header lapack C in C++ con Visual Studio 2010

Sto provando ad usare la funzione call lapack dalle funzioni C++ ma non sono riuscito all'inizio. Ecco il mio codice:

#include "stdafx.h" 
#include "targetver.h" 
extern "C" { 
#include "lapacke.h" 
} 


int main{} 
{ 
    return 0; 
} 

lo so "lapacke.h" è un colpo di testa C in modo da utilizzare la clausola extern "C". Ma mentre provo a compilare questa funzione banale, ho il seguente errore:

Error 1 error C2146: syntax error : missing ';' before identifier 'lapack_make_complex_float' c:\users\svd_example1\example2\example2\lapacke.h 89 1 example2 
Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\svd_example1\example2\example2\lapacke.h 89 1 example2 

Qualcuno sa che cosa ha causato questi errori?

Grazie mille!

+0

Inserire il codice qui – redFIVE

+0

@redFIVE, mi spiace per il formato, l'ho cambiato ... – Jason

+0

non lo farei avvolgere file di intestazione arbitrari in blocchi "extern" C "' (e di solito non è necessario in ogni caso, l'autore di intestazione avvolgerebbe le dichiarazioni come appropriato). –

risposta

5

La porzione rilevante dell'intestazione è:

/* Complex types are structures equivalent to the 
* Fortran complex types COMPLEX(4) and COMPLEX(8). 
* 
* One can also redefine the types with his own types 
* for example by including in the code definitions like 
* 
* #define lapack_complex_float std::complex<float> 
* #define lapack_complex_double std::complex<double> 
* 
* or define these types in the command line: 
* 
* -Dlapack_complex_float="std::complex<float>" 
* -Dlapack_complex_double="std::complex<double>" 
*/ 

/* Complex type (single precision) */ 
#ifndef lapack_complex_float 
#include <complex.h> 
#define lapack_complex_float float _Complex 
#endif 

/* ... */  

lapack_complex_float lapack_make_complex_float(float re, float im); 

Questo utilizza C99 _Complex predefinito, il quale Visual C++ non supporta. È possibile definire le macro come suggerito da usare std::complex invece, che sono supportati da Visual C++:

#include <complex> 
#define lapack_complex_float std::complex<float> 
#define lapack_complex_double std::complex<double> 
#include "lapacke.h" 
+0

Grazie per il tuo aiuto! Lo proverò! – Jason

+0

Ho provato la tua soluzione e ha funzionato molto bene! Ho anche provato a rimuovere il blocco "C" extern, ha funzionato anche. Allora quando ho bisogno dell'esterno "C"? – Jason

+0

@ user3689129 I buoni scrittori di libreria lo includeranno nell'intestazione stessa, se necessario, se tale intestazione dovrebbe essere utilizzabile dai programmi C++. Dovresti provare ad aggiungerlo solo se ottieni un errore di linker senza di esso - nel qual caso dovresti anche creare un bug report con il writer della libreria. –

Problemi correlati