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!
Vielen Dank, es funktioniert perfekt! –
@GuidoRanzuglia: Sie sollen eine Antwort akzeptieren, indem Sie das Häkchen auf der linken Seite anklicken. –