2012-04-05 11 views
3

Ich muss eine hässliche C-Bibliothek in meiner C++ - Anwendung verwenden. In der folgenden Erklärung werde ich es UglyLib nennen. Ich habe UglyLib erfolgreich als statisch verknüpfte Bibliothek kompiliert. In der Datei ugly.h UglyLib verwendet eine extern Variable:extern Variable Verknüpfung Fehler innerhalb einer statischen Bibliothek

Datei ugly.h:

extern SomeStruct_type somestruct; 

die Variable definiert in einer anderen Datei (und auch verwendet wird). Ich werde es anotherugly.c nennen.

Datei anotherugly.c:

SomeStruct_type somestruct; 

Meine C++ Anwendung wird auf einer generischen Template-Bibliothek basiert (TemplateLib) und die Anwendung selbst durch das Hauptfenster GUI-Code und auf einer Anwendungsbibliothek besteht statisch gelinkte mit dem Hauptfenstercode. Ich werde diese statisch verknüpfte Bibliothek ApplicationLib nennen.

TemplateLib enthält eine templatelibfile.h, die eine Funktion foo mit somestruct exportiert, die externe Variable von UglyLib.

Datei templatelibfile.h:

#include<ugly.h> 
... 
void foo() 
{ 
... 
do something with somestruct 
... 
} 

foo Funktion wird durch appllibfile.h im statisch gelinkte ApplicationLib enthalten sind, verwendet.

Datei appllibfile.h:

#include<templatelibfile.h> 
... 
void applfoo() 
{ 
... 
foo(); 
... 
} 

Hauptfenster-Anwendung enthält appllibfile.h

Datei main.cpp:

#include<appllibfile.h> 
... 
int main() 
{ 
... 
applfoo(); 
... 
return 0; 
} 

In VS2008, wenn ich versuche zu kompilieren Die Hauptfensteranwendung, der Microsoft Linker geben mir diesen Fehler

Fehler LNK2001: extern Symbol "struct SomeStruct_type SomeStruct" (? SomeStruct @@ 3USomeStruct_type @@ A)

Wenn ich in templatefile.ha Neudefinition der externen Variable hinzufügen stoppt der Compiler beschweren.

Datei templatelibfile.h:

#include<ugly.h> 
SomeStruct_type somestruct 
... 
void foo() 
{ 
... 
do something with somestruct; 
... 
} 

ABER Ich würde mir wünschen, es zu vermeiden, weil ich weiß nicht, ob es die richtige Sache zu tun (ich will nicht riskieren Ändern Sie die Semantik von UglyLib, indem Sie eine andere Instanz der Somestruct-Variablen neu definieren. Haben Sie einige Vorschläge, um das Verknüpfungsproblem zu vermeiden, ohne die Variable Somestruct extern neu zu definieren? Vielen Dank!

Antwort

4

Es ist wahrscheinlich wegen der Namens-Mangling, dass der C++ - Compiler tut.Da anotherugly.c eine C-Quelle ist (vermutlich mit einem C-Compiler kompiliert), wird das Symbol somestruct freigelegt, ohne dass es zu Fehlern kommt. Wenn Sie den Rest der Dateien mit einem C++ - Compiler kompilieren, sucht der Linker nach einem fehlenden Namen, der nicht vorhanden ist.

Ich denke, um die Deklaration in ugly.h in extern "C" könnte das Problem lösen.

+0

Vielen Dank, es funktioniert perfekt! –

+0

@GuidoRanzuglia: Sie sollen eine Antwort akzeptieren, indem Sie das Häkchen auf der linken Seite anklicken. –

Verwandte Themen