.dll Datei wird erstellt, .lib Datei aber nicht.



  • Guten Abend,

    Sorry wieder ne Anfängerfrage. Ich habe gerade mit Microsoft Visual C++ 2010 Express eine .dll via Debugging "Release" erstellt. Die .dll Datei ist auch da. Allerdings fehlt die .lib Datei.

    Das ist von Anfang an ein leeres .dll Projekt gewesen. Laut einem online Tutorial sollte sich die .lib Datei ebenfalls im selben Ordner nach dem Debugging befinden, was sie nicht tut.
    Liegt das an bestimmten Einstellungen im Programm? Bin gerade am schauen. Ich wüsste ehrlich gesagt gerade auch nicht wonach ich da suchen sollte 😕

    Padmad



  • Hast du auch irgendwas via __declspec (dllexport) exportiert?
    Falls nein haste dein Problem.



  • Ja, habe ich, eine deklarierte Klasse in der Header Datei.

    Namespace wddx
    {
    
    extern "C" __declspec (dllexport) class wDC_wddx
    {
      public:
    
        wDC_wddx();
        ~wDC_wddx();
    
        Methode();
        Methode2();
    };
    
    }
    

    ich will die ganze klasse exportieren. das ist so gewollt, damit ich später mit einer Instanz arbeiten kann.



  • Seit wann kann man eine *Klassde* (C++) mit "extern "C"" exportieren?



  • Das extern "C" habe ich entfernt. Ich hatte das anders verstanden und auch erstmalig benutzen wollen. Ich bin auf dem Gebiet der modularen Programmierung noch frisch. Es funktioniert aber dennoch nicht.

    Hier mal die .cpp Datei und die .h Datei, die ich zu einer .dll und .lib Datei machen möchte.

    /* header "wD_dx.h" */
    #ifndef H_WDDX
    #define H_WDDX
    
    #include <windows.h>
    #include <d3d11.h>
    #include <d3dx11.h>
    #include <d3dx10.h>
    
    namespace wddx
    {
      __declspec(dllexport) class wDC_directx
      {
        public:
    
    	  wDC_directx();
    	  ~wDC_directx();
    
        void Methode1(HWND, IDXGISwapChain*, ID3D11Device*, ID3D11DeviceContext*, UINT, bool);
        void Methode2(IDXGISwapChain*, ID3D11Device*, ID3D11DeviceContext*);
      };
    }
    
    #endif
    

    und die .cpp Datei.

    #include "wD_dx.h"
    
    #include <windows.h>
    #include <d3d11.h>
    #include <d3dx11.h>
    #include <d3dx10.h>
    
    namespace wddx
    {
      wDC_directx::wDC_directx(){}
      wDC_directx::~wDC_directx(){}
    
      void wDC_directx::Methode1
      (
        HWND hwnd, 
        IDXGISwapChain * wD_swapchain, 
        ID3D11Device * wD_dev, 
        ID3D11DeviceContext * wD_devcon,
        UINT bbuffer,
        bool windowed
      )
      {...}
    
      void wDC_directx::Methode2
      (
        IDXGISwapChain* wD_swapchain, 
        ID3D11Device* wD_dev, 
        ID3D11DeviceContext* wD_devcon
      )
      {...}
    }
    

    Es wird nach wie vor nur die .dll erstellt.



  • Die .lib Datei wird iirc mit Standardeinstellung im Zwischenverzeichnis angelegt.
    Geh doch mal in die Projekteigenschaften -> Bibliothekar, da sollte es eine Möglichkeit geben das Verzeichnis zu ändern wo die .lib Date ausgegeben wird.
    Ich stelle das immer sofort auf $(SolutionDir)\lib, daher hab ich das Problem so nicht gehabt.



  • Ich habe mal nen screen hochgeladen. Das sind meine Projektkonfigurationen momentan.

    http://www.windowdraft.com/screen.png

    ich habe gerade das Zwischenverzeichnis geändert. Beim Releasen wurde dann zwar ein Ordner "lib" erstellt, aber die .lib war da ebenfalls nicht drin. Oder meintest du nicht das Zwischenverzeichnis?



  • Ich hab jetzt nacheinander einfach mal erst ne .lib Datei erstellt und anschließend die .dll Datei. Ist das so auch möglich, oder muss der das in einem Zuge machen? Dann wäre das Problem ja nur, dass er das aus irgendeinem Grund nicht in einem Schwung macht, warum auch immer 😕



  • Du bist auf der falschen Eigenschaftenseite.
    So sieht das bei mir aus:
    http://imgur.com/a/hsw4t#0

    Das entscheidende ist im ersten Bild unter "Import Library". Das ist der Pfad wo die .lib Datei erstellt wird.



  • Hey,

    Also ich habe den Pfad der Import Library jetzt genauso angegeben. Der war vorher leer. Und jetzt erstellt er sowohl eine .dll, als auch eine .lib Datei, sowie auch eine .exp Datei. Das scheint also geklappt zu haben.

    ich glaube ich habe aber auch zusätzlich die klasse falsch exportiert. der Dll export kommt scheinbar wohl nach dem Schlüsselwort "class" und nicht davor. Also:

    class __declspec(dllexport) wDC_directx
    {};
    

    und nicht

    __declspec(dllexport) class wDC_directx
    {};
    

    Aber vielen Dank. Das eigentliche Problem dieses Beitrages scheint damit gelöst zu sein 🙂



  • Zu dllexport solltest du ein Marko anlegen:

    #ifdef MYPROJECT_BUILDS
    #define __declspec(dllexport) EXPORT
    #else
    #define __declspec(dllimport) EXPORT
    #endif
    

    Das verhindert dass du später linkerfehler bekommst wenn du die .dll verwendest.
    MYPROJECT_BUILDS musst du natürlich im DLL Projekt definieren.



  • Vielen Dank für den Hinweis, ich werde das später mit einbauen. Momentan klappt das erstmal soweit.


Log in to reply