2012-03-25 3 views
0

Ich habe einen CPP mit externen "C" -Funktionen. Wenn sie alle in einer einzigen Datei sind, funktioniert alles super. Ich möchte die Funktionen nur für organisatorische Zwecke in verschiedene Dateien aufteilen.C++ lnk2005 Fehler auf zwei Dateien mit externem "C", warum?

können also sagen, ich habe diese beiden Dateien:

File_One.cpp

#pragma once 
#include "stdafx.h" 
#include <windows.h> 
#include "Functions.h" 
#include "Variables.h" 
#include <string> 
#include "File_Two.cpp" 

extern "C" 
{ 
    __declspec(dllexport) void MethodOne() 
    { 
     MethodTwo(); 
    } 
} 

File_Two.cpp

#pragma once 
#include "stdafx.h" 
#include <windows.h> 
#include "Functions.h" 
#include "Variables.h" 
#include <string> 

extern "C" 
{ 
    __declspec(dllexport) void MethodTwo() 
    { 
    } 
} 

Ich habe versucht, neu anordnen meine umfassen Header in unterschiedlicher Reihenfolge und sogar Platziere keine Include-Header in file_one.cpp außer dem Include für file_two.cpp, aber ich bekomme immer die gleichen Fehler.

1) Fehler LNK1169: ein oder mehr mehrfach gefunden definierte Symbole

2) Fehler LNK2005: _MethodTwo bereits in File_One.obj

definiert

Was genau mache ich falsch? Was soll ich tun, um es zu beheben?

Vielen Dank!

+0

Es ist normalerweise keine gute Sache, eine cpp-Datei in eine andere aufzunehmen. Wenn Sie dies tun, müssen Sie sicherstellen, dass die enthaltene cpp-Datei nicht kompiliert und verknüpft wird. –

+0

Ich nahm Ihren Rat und baute eine Header-Datei und es hat funktioniert. –

Antwort

1

Sie stoßen wahrscheinlich auf Probleme, weil Sie die Datei File_two.cpp in Ihre Datei File_one.cpp einschließen. Was passiert ist, dass File_two.cpp und File_one.cpp kompiliert und verknüpft werden. Aber da File_two.cpp in File_one.cpp enthalten ist, sieht der Linker zwei Kopien von MethodTwo, und kann nicht entscheiden, welche zu verwenden.

Sie sollten die Erklärungen zu einem Header verschieben:

File_two.h:

extern "C" 
{ 
    __declspec(dllexport) void MethodOne() 
} 

Und schließen, dass statt.

File_one.h:

extern "C" 
{ 
    __declspec(dllexport) void MethodOne(); 
} 

dann die verschiedenen Funktionen mit ihrem Körper in ihren jeweiligen .cpp Dateien definieren. Keine Notwendigkeit für externes "C" in den Quelldateien.

Verwandte Themen