none
Warnung bei Verwendung von Typen aus atltypes.h in dllexport-ierten Klassen RRS feed

  • 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

    Montag, 30. Juni 2014 14:16

Alle Antworten

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

    Dienstag, 1. Juli 2014 14:51
  • 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).

    Donnerstag, 3. Juli 2014 07:25