2016-12-01 4 views
0

Ich versuche, ein Programm mit MPIC++ auf einem Linux-System zu kompilieren. Das Programm enthält Quelldateien von unserem Professor und es sind diese Dateien, die die Fehler werfen. In Visual Studio C++ ist es kein Problem, den Code zu kompilieren, aber wir müssen ihn auf einem Linux-System starten, und wenn ich ihn auf das Linux-System verschiebe, um ihn mit mpiC++ zu kompilieren, tritt ein Fehler auf.C++ - Kompilierung mit MPIC++ Fehler

mpic++ -std=c++11 -Wall -c CommonApprox.cpp 
In file included from ApproxIface.h:3:0, 
       from CommonApprox.h:3, 
       from CommonApprox.cpp:1: 
referencedIface.h:23:19: error: '__stdcall' declared as a 'virtual' field 
referencedIface.h:23:19: error: expected ';' at end of member declaration 
referencedIface.h:23:90: error: ISO C++ forbids declaration of 'QueryInterface'   with no type [-fpermissive] 
referencedIface.h:24:17: error: '__stdcall' declared as a 'virtual' field 
referencedIface.h:24:17: error: expected ';' at end of member declaration 
referencedIface.h:24:17: error: redeclaration of 'ULONG IReferenced::__stdcall' 
referencedIface.h:23:19: note: previous declaration 'HRESULT IReferenced::__stdc   all' 

Die Error gehen weiter und weiter, das sind nur die ersten paar. Der Code, auf den dieser spezielle Fehler verweist, ist unten gezeigt.

#define IfaceCalling __stdcall 

class IReferenced { 
    /* Actually, this is IUnknown of the WinAPI's COM 
    HRESULT and ULONG are used to allow possible and easy interoperability 
    accross different compilers and languages on Windows 
    */ 

public: 
    virtual HRESULT IfaceCalling QueryInterface(/*REFIID */ void* riid,  void ** ppvObj) = 0; 
    virtual ULONG IfaceCalling AddRef() = 0; 
    virtual ULONG IfaceCalling Release() = 0; 
}; 

Soweit ich weiß, ist es uns nicht gestattet, den Code zu ändern, der uns zur Verfügung gestellt wurde.

Vielen Dank für Ihre Hilfe.

EDIT:

Ich benutze eine Make-Datei, das Programm zu kompilieren.

OBJECTS = CommonApprox.o DatabaseHandler.o MaskHandler.o Output.o StatsHandler.o GlucoseLevels.o AkimaInterpolation.o CatmullRomInterpolation.o ApproxIface.o referencedImpl.o main.o 

CFLAGS = -std=c++11 -Wall 
LIBS = -lsqlite3 -ltbb 
CC = mpic++ 

all: ku_ppr_distr 

ku_ppr_distr : $(OBJECTS) 
    $(CC) $(CFLAGS) $^ $(LIBS) -o [email protected] 
    rm -f *.o 

CommonApprox.o: CommonApprox.cpp CommonApprox.h hresult.h 
    $(CC) $(CFLAGS) -c CommonApprox.cpp 

DatabaseHandler.o: DatabaseHandler.cpp DatabaseHandler.h 
    $(CC) $(CFLAGS) -c DatabaseHandler.cpp 

MaskHandler.o: MaskHandler.cpp MaskHandler.h 
    $(CC) $(CFLAGS) -c MaskHandler.cpp 

Output.o: Output.cpp Output.h 
    $(CC) $(CFLAGS) -c Output.cpp 

StatsHandler.o: StatsHandler.cpp StatsHandler.h 
    $(CC) $(CFLAGS) -c StatsHandler.cpp 

GlucoseLevels.o: GlucoseLevels.cpp GlucoseLevels.h 
    $(CC) $(CFLAGS) -c GlucoseLevels.cpp 

AkimaInterpolation.o: AkimaInterpolation.cpp AkimaInterpolation.h 
    $(CC) $(CFLAGS) -c AkimaInterpolation.cpp 

CatmullRomInterpolation.o: CatmullRomInterpolation.cpp CatmullRomInterpolation.h 
    $(CC) $(CFLAGS) -c CatmullRomInterpolation.cpp 

ApproxIface.o: ApproxIface.cpp ApproxIface.h 
    $(CC) $(CFLAGS) -c ApproxIface.cpp 

referencedImpl.o: referencedImpl.cpp referencedImpl.h 
    $(CC) $(CFLAGS) -c referencedImpl.cpp 

main.o: main.cpp 
    $(CC) -w $(CFLAGS) -c main.cpp 

%.o: %.c 
    $(CC) -c $< 

clean: 
    rm -f *.o 

Antwort

0

mpic++ ist ein Wrapper für g++ (die GNU C++ Compiler auf Linux). __stdcall ist eine Visual C++ - spezifische Compiler-Direktive zum Steuern des generierten Codes, der von g++ nicht erkannt wird. Sie könnten versuchen, eine Null-Definition für __stdcall auf Ihre Make-Datei hinzugefügt, das heißt

CFLAGS = -D__stdcall= -std=c++11 -Wall

Die von ganz wenigen Fehlermeldungen loswerden sollte.

+0

Dank für die Beantwortung, ich habe das Problem behoben, indem '#ifndef _WINDOWS' Zugabe ' #define __stdcall' '# endif' (sorry, ich weiß nicht, wie mehrzeiligen Code in einem Kommentar zu schreiben) – finrod

+0

Ich dachte, du hättest gesagt, dass du den Code, der dir gegeben wurde, nicht ändern darf - deshalb habe ich vorgeschlagen, dass du es im Makefile machst :) – stanthomas