OK, also habe ich einige Fragen und Artikel zu diesem Thema gelesen, und ich habe das Gefühl, dass ich die Grundlagen verstehe, aber ich habe immer noch Probleme.
Ich habe eine DLL, die eine Klasse exportiert, die eine std :: string als Mitglied hat. Mein Hauptprogramm enthält Klassen, die auch Zeichenfolgen enthalten, und es verwendet die DLL.
Wenn ich die DLL in VS2010 kompiliere, erhalte ich die folgenden Warnungen:
%Vor%Wenn ich die EXE kompiliere, bekomme ich die gleichen Warnungen, aber es gibt keine Fehler, und das Programm kompiliert und läuft. In Wirklichkeit ist es ein großes Projekt, also bekomme ich 40 Warnungen, und ich bin nicht allzu scharf darauf. (Als eine Nebenbeobachtung sind diese Warnungen nicht vorhanden, wenn sie mit VS2008 kompiliert wurden)
Also habe ich über diese Warnung gelesen, und sie hat mich zu diesem MS-Artikel geführt: Ссылка Hier erfahren Sie, wie Sie eine STL-Vorlage aus einer DLL exportieren, um die Warnungen zu erfüllen, die ich erhalten habe.
Das Problem ist, wenn ich die folgenden Zeilen hinzufüge, um die Warnungen zu entfernen:
%Vor%Die DLL kompiliert ohne Warnungen, aber wenn ich meine EXE kompiliere, löst der Linker eine Anpassung aus:
%Vor%Sowohl die DLL als auch die EXE werden mit den gleichen Codegenerierungsoptionen kompiliert. Ich kann MT auf beiden oder MD verwenden, und die Ergebnisse sind die gleichen.
Ich füge den Code aus einem minimierten Beispielprogramm ein, falls ich oben etwas weggelassen habe.
Meine Hauptfrage: Kann ich die LNK2005-Fehler beheben oder ist es einfach, die C4251-Warnungen zu ignorieren?
Bearbeiten: Also habe ich ein wenig mehr gelesen, und es sieht so aus, als ob die std :: string, die die DLL-Klasse verwendet, eine private Variable ist, auf die nur von Member-Funktionen zugegriffen wird sicher sein, die Warnung zu ignorieren ... Kommentare dazu? Ist das ein Schritt in die richtige Richtung?
DLL-Code:
%Vor%EXE-Code:
%Vor%Es sieht so aus, als ob Sie das Problem auf connect.microsoft.com .
Es gibt einen Workaround, der dort vorgeschlagen wird, aber es scheint ein bisschen unangenehm.
Weitere hilfreiche Optionen:
Link zum MS-Artikel, den Sie vorgestellt haben, besagt, dass einige STL-Klassen "... bereits von der C-Laufzeit-DLL exportiert wurden. Daher können Sie sie nicht aus Ihrer DLL exportieren." Einschließlich basic_string. Und Ihr Link Fehler sagt, dass Basic_string Symbol "... bereits in OtherClass.obj definiert". Weil Linker zwei gleiche Symbole an zwei verschiedenen Stellen sieht.
Beim Exportieren der STL std :: basic_string Vorlage aus der DLL bekomme ich einen LNK2005 Fehler
Siehe auch den Artikel KB 168958 von Microsoft. Exportieren einer Instanziierung einer STL-Klasse (Standard Template Library) und einer Klasse enthält ein Datenelement, das ein STL-Objekt ist . Aus dem Artikel:
So exportieren Sie eine STL-Klasse
- Verknüpfen Sie in der DLL- und der EXE-Datei die gleiche DLL-Version der C-Laufzeit. Verknüpfen Sie beide mit Msvcrt.lib (Release-Build) oder Verknüpfen Sie beide mit Msvcrtd.lib (debug build).
- Geben Sie in der DLL den __declspec-Bezeichner in der Template-Instanziierungsdeklaration an, aus dem die STL-Klasseninstanziierung exportiert werden soll die DLL.
- Stellen Sie in der .exe-Datei die externen und __declspec-Spezifizierer in der Template-Instanziierungsdeklaration bereit, um die Klasse aus der .exe- Datei zu importieren DLL. Dies führt zu einer Warnung C4231 "nicht standardmäßige Erweiterung verwendet: 'extern' vor der expliziten Instanziierung der Vorlage. "Sie können dies ignorieren Warnung.
Ich habe einen Hack, der das in temp
beheben kannÖffnen Sie Projektoptionen, klicken Sie auf Linker- & gt; Befehlszeile, Geben Sie im Eingabefeld für zusätzliche Optionen
ein %Vor%Für mich ging das ganze Thema auf
zurückHabe das Problem für mich bisher immer behoben.
Leider ist das keine Antwort, wenn Sie keine Kontrolle über den Quellcode haben, mit dem Sie verlinken möchten.
Tags und Links c++ dll visual-studio-2010 stl