Fragensteller
Warnung bei Verwendung von Typen aus atltypes.h in dllexport-ierten Klassen

Frage
-
Hallo,
ich versuche gerade, eine große VS2013 Solution mit einigen C++ Projekten derart umzustellen, dass ich die Verwendung der MFC möglichst vermeide und stattdessen die ATL (für die Basis-Typen wie CString, CRect, CPoint) nehme.
Nach der Umstellung bekomme ich bei Klassen, die mit dllexport nach außen freigegeben werden, die folgende Warnung:
\polygon.h(65): warning C4251: 'CPolygon::m_rtBoundingBox' : class 'CRect' needs to have dll-interface to be used by clients of class 'CPolygon'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\atlmfc\include\atltypes.h(130) : see declaration of 'CRect'
Das war vorher nicht der Fall, bei dynam. gelinkten MFC klappte das. Da die ATL jetzt statisch gelinkt werden, befürchten wir Probleme, wenn zwei unserer Projekte z.B. CRect verwenden, dann wird die Klasse in jeder DLL angelinkt und es gibt mehrfach definierte Symbole beim Linken, wenn ein drittes Projekt bei verwendet.Gibt es einen Ausweg?
GrußThomas
Alle Antworten
-
Hallo Thomas,
Schau Dir mal folgende Artikel an http://support.microsoft.com/kb/168958/en-us
Gruss,
Ionut
Ionut Duma, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Hallo,
ich fürchte, das trifft das Problem nicht ganz. Ich verwende keine STL templates, allerdings die ATL templates wie CAtlArray. Das ist aber an den Stellen, wo die Warnung kommt, auch nicht der Fall.
Ich habe mal eine Test-Klasse in das Projekt aufgenommen:
#pragma once class DllExport CTest { public: CTest(); ~CTest(); protected: CRect m_test; };
Die ergibt die Warnung
1> Test.cpp
1>test.h(9): warning C4251: 'CTest::m_test' : class 'CRect' needs to have dll-interface to be used by clients of class 'CTest'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\atlmfc\include\atltypes.h(130) : see declaration of 'CRect'
Dabei ist DllExport zu __declspec(dllexport) definiert.
-
Ich habe gerade mal ein neues, leeres Projekt angelegt, um die Warnung zu isolieren:
* Neues Win32 Projekt.
* Im Wizard auf DLL, ATL Header hinzufügen, Symbole exportieren.
* Anschließend habe ich in stdafx.h noch den atltypes.h Header hinzugefügt.
* Die Definition der automatisch generierten exportierten Beispielklasse (Ctestdll in meinem Fall) habe ich um einen public Member vom Typ CRect erweitert.
Das wars, das so modifizierte Projekt erzeugt wieder die Warnung
1>e:\sources\samples+tests\vs2013\testdll\testdll\testdll.h(18): warning C4251: 'Ctestdll::member' : class 'CRect' needs to have dll-interface to be used by clients of class 'Ctestdll'
1> c:\program files (x86)\microsoft visual studio 12.0\vc\atlmfc\include\atltypes.h(130) : see declaration of 'CRect'
Eine ähnliche Warnung kommt, wenn man stattdessen die Klasse von CRect ableitet (C4275).