DLL_EXPORT funktioniert plötzlich nicht mehr?!



  • moin,
    bei mir funktioniert ohne erkennbaren grund eine dll bindung in einer von mehreren dlls nicht mehr. vielleicht bin ich derbe blind, aber ich kann einfach kein problem erkennen. ich habe mal screenshots gemacht, damit ihr die farbkodierungen in visual studio seht.
    http://gemini-sites.de/forumImages/dll01.gif
    und die global.h
    http://gemini-sites.de/forumImages/dll02.gif
    da ich DLL_EXPORT vor #include "global.h" definiere, müsste doch __declspec(dllexport) aktiv sein?!
    vielleicht ist ja visual studio das problem? kann ich da irgendwo außer "projekt bereinigen" etwas reseten?
    danke!



  • Da eine Headerdatei ohnehin nicht für sich vom Compiler bearbeitet wird, kannst das am Header selbst gar nicht ablesen. Wichtig ist, was in jeder einzelnen .cpp-Datei passiert, die page3d.h und/oder global.h einbindet.



  • danke, ich poste mal mehr infos.
    die konkrete meldung:

    2>..\src\tubedataprintout.cpp(12): warning C4273: 'libClientOutput::TubeDataPrintout::drawPrintPage': Inkonsistente DLL-Bindung.
    2> c:\ecworks_mep\libclientoutput\src\tubedataprintout.h(31): Siehe vorherige Definition von 'drawPrintPage'

    tubedataprintout.h:
    Wenn ich direkt oben den include mit dem auskommentierten bereich ersetze ist alles ok, aber warum?

    #ifndef __LIB_CLIENT_OUTPUT_PRINTOUT__
    #define __LIB_CLIENT_OUTPUT_PRINTOUT__
    
    #define DLL_EXPORT
    #include "global_cliout.h"
    //#ifndef DLL_EXPORT
    //#define DECLDIR_CLI_OUT __declspec(dllimport)
    //#else
    //#define DECLDIR_CLI_OUT __declspec(dllexport)
    //#endif
    #include "printoutbase.h"
    
    namespace libClientOutput{
    
    	class DECLDIR_CLI_OUT TubeDataPrintout : public libprint::PrintoutBase {
    	public:
    		TubeDataPrintout(wxString title, libdf::DIdxMgr *_mgr, int _objNr, TubeDataPanel *_tdPanel) : libprint::PrintoutBase(title, _mgr, _objNr){
    			tdPanel = _tdPanel;
    		}
    
    		void DrawPageOne(){}
    		void DrawPageTwo(){}
    
    		void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo);
    	private:
    
    		TubeDataPanel *getTubeDataPanel(){ return tdPanel; }
    		TubeDataPanel *tdPanel = nullptr;
    
    		bool OnPrintPage(int pageNo);
    		void drawPrintPage(int pageIdx);
    	};
    
    }
    
    #endif
    

    global_cliout.h:

    #ifndef __LIB_CLI_OUT_GLOBAL__
    #define __LIB_CLI_OUT_GLOBAL__
    
    namespace libClientOutput {
    
    /** dll export für windows dll
    */
    #ifndef DLL_EXPORT
    #define DECLDIR_CLI_OUT __declspec(dllimport)
    #else
    #define DECLDIR_CLI_OUT __declspec(dllexport)
    #endif
    
    //#pragma warning( disable: 4251 )
    }
    
    #define SQRT2		1.4142135
    
    #endif
    

    printoutbase.h in einer anderen dll/namespace:

    #ifndef __LIBPRINT_PRINTOUT_BASE_H__
    #define __LIBPRINT_PRINTOUT_BASE_H__
    
    // in abgeleiteten klassen notwendig
    #define DLL_EXPORT
    #include "global.h"
    #include <wx/print.h>
    
    namespace libdf {
    	class DIdxMgr;
    }
    
    namespace libprint { 
    
    class DECLDIR_PRINT PrintoutBase : public wxPrintout {
    public:
    	PrintoutBase(wxString title, libdf::DIdxMgr *_mgr, int _objNr) : wxPrintout(title){
    		mgr = _mgr;
    		objNr = _objNr;
    
    		// -- das alles hier global machen
    		g_printData = wxPrintData();
    		// You could set an initial paper size here
    		g_printData.SetPaperId(wxPAPER_A4);    
    
    		g_pageSetupData = wxPageSetupDialogData(g_printData);
    
    		g_printDlgData = wxPrintDialogData();
    	};	
    
    	~PrintoutBase(){}
    
    	 //Global print data, to remember settings during the session
    	wxPrintData g_printData;
    
    	 //Global page setup data
    	wxPageSetupDialogData g_pageSetupData;
    
    	wxPrintDialogData g_printDlgData;
    
    	void setFromTo(wxPoint _fromTo){ fromTo = _fromTo; }
    protected:
    	libdf::DIdxMgr *mgr;
    	int objNr;
    
    	wxPoint fromTo = wxDefaultPosition;
    private:
    	virtual void DrawPageOne() = 0;
    	virtual void DrawPageTwo() = 0;
    
    	bool HasPage(int page){
    		this;
    		return page >= fromTo.x && page <= fromTo.y; 
    	}
    
    	virtual bool OnPrintPage(int page)
    	{
    		this;
    
    		wxDC *dc = GetDC();
    		if (dc)
    		{
    			if (page == 1)
    				DrawPageOne();
    			else if (page == 2)
    				DrawPageTwo();
    
    			return true;
    		}
    		else
    			return false;
    	}
    };
    
    }
    
    #endif
    

    und global.h:

    #ifndef __LIBPRINT_GLOBAL__
    #define __LIBPRINT_GLOBAL__
    
    namespace libprint {
    
    /** dll export für windows dll
     */
    #ifndef DLL_EXPORT
    #define DECLDIR_PRINT __declspec(dllimport)
    #else
    #define DECLDIR_PRINT __declspec(dllexport)
    #endif
    
    //#pragma warning( disable: 4251 )
    //#pragma warning( disable: 4275 )
    //#pragma warning( disable: 4996 )
    
    }
    
    #endif
    


  • Ich sage dir, dass du an Headerdateien nichts ablesen kannst, und du zeigst mehr Headerdateien 🙄

    Interessant ist, was in tubedataprintout.cpp passiert.

    Grundsätzlich finde ich es seltsam, DLL_EXPORT überhaupt in einem Header zu definieren.



  • in der cpp datei ist nicht viel los:

    #include "tubedataprintout.h"
    
    using namespace libClientOutput;
    
    void TubeDataPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo)
    {
    	//*minPage = 1;
    	//*maxPage = getTubeDataPanel()->getChosenObject()->getPages()->size();
    	//*selPageFrom = fromTo.x;
    	//*selPageTo = fromTo.y;
    }
    

    das seltsame ist auch, dass ich das auf genau dieselbe art in etlichen anderen dlls mache, nur hier bekomme ich einen fehler. deswegen meine anfängliche vermutung, dass visual studio das problem sein könnte?



  • Definiere DLL_EXPORT in der .cpp bevor du deine Header includest.



  • danke, hat leider nichts geändert:

    #define DLL_EXPORT
    
    #include "tubedataprintout.h"
    
    using namespace libClientOutput;
    
    void TubeDataPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo)
    {
    	//*minPage = 1;
    	//*maxPage = getTubeDataPanel()->getChosenObject()->getPages()->size();
    	//*selPageFrom = fromTo.x;
    	//*selPageTo = fromTo.y;
    }
    

    fehlermeldung:

    2>..\src\tubedataprintout.cpp(13): warning C4273: 'libClientOutput::TubeDataPrintout::GetPageInfo': Inkonsistente DLL-Bindung.
    2> c:\ecworks_mep\libclientoutput\src\tubedataprintout.h(28): Siehe vorherige Definition von 'GetPageInfo'

    eigenartig ist auch, dass in einer neu erstellten testklasse alles ok zu sein scheint:http://gemini-sites.de/forumImages/dll03.gif



  • Wenn du Code weglässt, solltest du prüfen, ob das, was übrig ist, das Problem noch reproduziert.



  • extrem minimalisiert:
    das hier funktioniert:

    #ifndef __TEST1__
    #define __TEST1__
    
    #define DLL_EXPORT
    #include "global_cliout.h"
    
    namespace libClientOutput{
    	class DECLDIR_CLI_OUT test1{
    
    	public:
    		void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo);
    
    	};
    
    }
    
    #endif
    
    #include "test.h"
    
    void libClientOutput::test1::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo)
    {
    
    }
    

    aber das hier nicht:

    #ifndef __LIB_CLIENT_OUTPUT_PRINTOUT__
    #define __LIB_CLIENT_OUTPUT_PRINTOUT__
    
    #define DLL_EXPORT
    #include "global_cliout.h"
    
    namespace libClientOutput {
    
    	class DECLDIR_CLI_OUT TubeDataPrintout {
    	public:
    
    		void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo);
    	private:
    	};
    
    }
    
    #endif
    
    #include "tubedataprintout.h"
    
    void libClientOutput::TubeDataPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo)
    {
    }
    

    😕

    UPDATE: ein neuer hinweis: test1 funktioniert nicht mehr wenn ich die dateien in denselben ordner wie die anderen dateien der dll kopiere, auf dem desktop war alles ok!



  • mael15 schrieb:

    test1 funktioniert nicht mehr wenn ich die dateien in denselben ordner wie die anderen dateien der dll kopiere, auf dem desktop war alles ok!

    Wahrscheinlich hast du in deinen Include-Verzeichnissen Dateien mit demselben Namen, aber unterschiedlichem Inhalt herumliegen.



  • MFK schrieb:

    Wahrscheinlich hast du in deinen Include-Verzeichnissen Dateien mit demselben Namen, aber unterschiedlichem Inhalt herumliegen.

    das war tatsächlich der fall. daraufhin habe ich:
    - allen global.h einen individuellen namen gegeben
    - die includes entsprechend angepasst
    - die gesamt projektmapp mit allen dlls bereinigt
    - alle vorkompilierten header neu erstellt
    leider ist problem noch immer dasselbe. 😕



  • Ohne Einsicht in die ganze Projektmappe finden wir das wohl nicht. Darum ein grundsätzlicher Rat: DLL_EXPORT solltest du in den Projekteinstellungen der DLL definieren, nicht in irgendwelchen Headerdateien. Die Gefahr ist viel zu groß, dass du es irgendwo vergisst, oder dass irgendein Programm, das die DLL benutzen soll, so einen Header verwendet.

    Alternativ kannst du es in allen .cpp-Dateien der DLL, vor allen Include-Direktiven definieren. Aber auch das ist fehleranfällig.



  • das problem ist gelöst. ich hatte eine header datei, die vor dem include der global.h kein DLL_EXPORT definiert hatte. durch eine änderung der buildreihenfolge wurde diese datei plötzlich zuerst bearbeitet, sodass dann spätere DLL_EXPORT nicht mehr den gedachten effekt hatten.

    MFK schrieb:

    DLL_EXPORT solltest du in den Projekteinstellungen der DLL definieren, nicht in irgendwelchen Headerdateien.

    das werde ich definitiv machen, damit wäre das problem wohl nicht aufgetreten.
    danke für eure mühe!


Log in to reply