2009-06-14 12 views
1

Meine VC++ Lösung enthält zwei Projekte, eine Anwendung (exe) und eine statische Bibliothek.Wie verknüpft man eine statische Bibliothek in Visual C++ 2008?

Beide kompilieren gut, aber nicht zu verknüpfen. Ich erhalte einen "nicht aufgelösten externen Symbol" -Fehler für jede Funktion aus der statischen Lib, die ich benutze. Sie sehen wie folgt aus:

MyApplication.obj: Fehler LNK2019: nicht aufgelöstes externes Symbol "__declspec (dllimport) int __cdecl MyStaticLibrary :: akzeptieren (int, struct sockaddr *, int *)"

Die App finden ist die .lib geht es gut, das ist also nicht das Problem. Ich denke, der "dllimport" ist das Problem - warum sollte es da sein, wenn ich versuche, eine statische Bibliothek zu erstellen? Sowohl die App als auch die Bibliothek verwenden die Laufzeitbibliothek "Multi-threaded (/ MT)", nicht "Multi-threaded DLL (/ MD)".

EDIT:

Ich denke, einige der Antworten richtig sind. Die Bibliothek, die UDT genannt wird, hat dies in der Haupt-Header-Datei:

#ifdef UDT_EXPORTS 
    #define UDT_API __declspec(dllexport) 
#else 
    #define UDT_API __declspec(dllimport) 
#endif 

Bedeutet dies, es nicht als eine statische Bibliothek verwendet wird gemeint war?

+3

Also ist das Geheimnis, woher __declspec (dllimport) stammt - vermutlich die .h-Datei der Bibliothek, aber wie ist es da? Irgendein Makro wild gegangen? Wie geht es dir? –

Antwort

3

Wie stellen Sie die Verbindung her? Und wie sieht Ihre Header-Datei für MyApplication und MyStaticLibrary :: accept aus?

Wenn sich beide Projekte in der gleichen Lösungsdatei befinden, klicken Sie mit der rechten Maustaste auf die Lösungsdatei-> Eigenschaften und legen Sie dann die Bibliothek als Abhängigkeit von der Anwendung fest. Visual Studio wird die Verknüpfung automatisch verarbeiten und außerdem sicherstellen, dass der Build der Bibliothek beim Erstellen Ihrer Anwendung auf dem neuesten Stand ist.

Dieser Fehler hört sich an, als ob Sie es als DLL-Import/Export in Ihrer Header-Datei definiert haben.

Bearbeiten: Ja, das ist das Problem. Sie haben es wahrscheinlich zuerst als dynamische Bibliothek erstellt? (oder wer auch immer es geschrieben hat.)

Es gibt ein paar Optionen.

1) Sie können einfach alle diese Sachen und alle UDT_API-Modifikatoren im Code löschen.

2) Sie können das Zeug löschen und fügen Sie diese Zeile:

#define UDT_API 

3) Eine robustere Lösung ist es, dies zu ändern:

#ifdef UDT_STATIC 
    #define UDT_API 
#else 
    #ifdef UDT_EXPORTS 
     #define UDT_API __declspec(dllexport) 
    #else 
     #define UDT_API __declspec(dllimport) 
    #endif 
#endif 

Und dann die Präprozessordirektive hinzufügen UDT_STATIC Wenn Sie es als statische Bibliothek verwenden möchten, entfernen Sie es, wenn Sie es als dynamische Bibliothek verwenden möchten. (Muss zu beiden Projekten hinzugefügt werden.)

+0

Überprüfen Sie meine Bearbeitung oben für weitere Informationen, ich denke, das ist der Grund. –

+0

Hmm, mit der robusten Lösung oben erzeugt immer noch die gleichen Fehler, nur jetzt __declspec (dllexport) ist __declspec (dllimport). Ich muss vielleicht nur in den sauren Apfel beißen und meine Lösung überarbeiten, um DLLs zu verwenden. –

+0

Haben Sie UDT_STATIC den Präprozessordirektiven in beiden Projekten hinzugefügt und beide neu erstellt? – Gerald

0

Da Sie mit Sockets arbeiten, müssen Sie WS2_32.lib in den zusätzlichen Abhängigkeiten des Projekts hinzufügen.

+0

Ja, ich habe das enthalten, danke für die Überprüfung. –

+0

Normalerweise erhalten Sie einen solchen Fehler, wenn Sie die Bibliothek nicht hinzufügen. Das ist seltsam. Sind Sie sicher, dass Sie es unter zusätzlichen Abhängigkeiten haben? Versuchen Sie es auch in den allgemeinen libs Abschnitt. –

+0

Es beschweren sich über seine Klassenmethode akzeptieren, nicht die Winsock-Funktion akzeptieren. – Gerald

0

Es sieht so aus, als hätten die exportierten Funktionen in der statischen Bibliothek die falsche Aufrufkonvention. Wie sieht die Header-Datei für die exportierten Funktionen aus?

Ok, also verwenden die Funktionen UDT_API als Präfix.Sie sollten nicht, wenn Sie nur eine statische .lib erstellen, um zu verknüpfen.

Eine Alternative ist, die lib zu ändern, um stattdessen eine DLL zu erstellen. Sie erstellen also statische Verknüpfungen mit einer DLL. Das einzige Problem ist, dass Sie die DLL mit Ihrer App bereitstellen müssen. Immer noch keine schlechte Lösung, da Sie Korrekturen in der lib vornehmen können.

+0

Sie können Recht haben, überprüfen Sie meine Bearbeitung an der Spitze für weitere Informationen. –

Verwandte Themen