2014-07-20 4 views
5

Bitte helfen Sie mir! Es dauert Stunden im Internet zu suchen und ich habe keine Lösung gefunden ....Fehler mit lapack C Header in C++ mit Visual Studio 2010

Ich versuche, die Call-lapack-Funktion von C++ Funktionen zu verwenden, aber ich scheiterte am Anfang. Hier ist mein Code:

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


int main{} 
{ 
    return 0; 
} 

Ich weiß "lapacke.h" ist ein C-Header, so verwende ich die extern "C" Klausel. Aber während ich versuche, diese triviale Funktion zu kompilieren, ich habe die folgende Fehlermeldung:

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 

Wer weiß, was diese Fehler verursacht?

Vielen Dank!

+0

Code eingeben hier – redFIVE

+0

@redFIVE, für das Format sorry, ich habe es geändert ... – Jason

+0

würde ich nicht Wrapper beliebige Header-Dateien in 'externen" C "' Blöcke (und es ist in der Regel nicht notwendig, der Header-Autor würde die Deklarationen wie angemessen umhüllen). –

Antwort

5

Der relevante Teil des Headers ist:

/* 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); 

Diese C99 verwendet _Complex standardmäßig, die Visual C++ nicht unterstützt. Sie können diese Makros definieren, wie vorgeschlagen std::complex stattdessen zu verwenden, die von Visual C++ unterstützt:

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

Vielen Dank für Ihre Hilfe! Ich werde es versuchen! – Jason

+0

Ich habe Ihre Lösung versucht und es hat sehr gut funktioniert! Ich habe auch versucht, den externen "C" -Block zu entfernen, es hat auch funktioniert. Wann brauche ich dann das externe "C"? – Jason

+0

@ user3689129 Gute Bibliotheksverfasser werden es in den Header selbst aufnehmen, wenn es erforderlich ist, dass dieser Header von C++ - Programmen verwendet werden kann. Sie sollten nur versuchen, es hinzuzufügen, wenn Sie einen Linker-Fehler ohne es erhalten - in diesem Fall sollten Sie auch einen Fehlerbericht mit dem Bibliotheksschreiber einreichen. –