Beim Exportieren der STL std :: basic_string-Vorlage aus der DLL erhalte ich den Fehler LNK2005

9

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%     
JPhi1618 23.01.2012, 18:23
quelle

5 Antworten

3

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:

  1. Exportieren Sie nicht std :: string, sondern verwenden Sie const char * in der DLL-Schnittstelle (siehe Ссылка )
  2. Stellen Sie sicher, dass _ITERATOR_DEBUG_LEVEL für alle Ihre Projekte übereinstimmt
danio 11.09.2012, 08:50
quelle
2

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.

    
Kaponir 10.11.2013 17:52
quelle
0
  

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

     
  1. 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).
  2.   
  3. Geben Sie in der DLL den __declspec-Bezeichner in der Template-Instanziierungsdeklaration an, aus dem die STL-Klasseninstanziierung exportiert werden soll   die DLL.
  4.   
  5. 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.
  6.   
    
jww 08.04.2015 05:02
quelle
0

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%     
bowman han 31.03.2016 11:20
quelle
0

Für mich ging das ganze Thema auf

zurück
  • STL-Zeug nicht exportieren. Ignoriere die Warnung. (Mindestens bis MSVC2013.)
  • Stellen Sie natürlich sicher, dass jede Partei auf die gleiche Weise mit der C-Laufzeit verbunden ist, was Debug / Release, statisch / dynamisch, betrifft.

Habe 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.

    
yau 25.09.2016 13:40
quelle

Tags und Links