Verlinken von statischen libs + DLLs



  • nur beim linker
    sag dein compiler und dir wird geholfen.



  • MS VC++ 6.0



  • Thread verschoben ins msvc Forum.
    MFC mit dem Visual C++



  • Jetzt hab ich mal den Titel ein wenig erweitert.
    Ich hab versucht anstatt einer statischen Bibliothek eine DLL zu verwenden
    (nach diesem Tutorial: http://www.resourcecode.de/?tutorial=1&id=88 )

    In meinem Win32-DLL Projekt befinden sich 6 Dateien (3 *.h + 3 *.cpp)
    Es sind alles Klassen und sie werden auch richtig exportiert
    Wenn ich kompiliere erstellt er die DLL und findet auch keine Fehler

    Dann hab ich die DLL in den Ordner meines richtigen Projekts kopiert und *.dll Datei dem Projekt hinzugefügt

    Wenn ich jetzt Versuche einen der 3 Header in der DLL zu inkludieren, geibt er Link-Fehler aus

    was hab ich falsch gemacht / vergessen ?

    Wenn ich die Erklärung meines Vorgehens etwas präzisieren soll, sagt s mir, bitte.



  • Eine dll läßt sich mit dem dynamschen laden der dll in ein Programm einbinden.
    Dafür muss man aber die erportfunktionen wissen und sich einen Zeiger darauf besorgen.

    Wenn du eine dll und ihre funktionen mitcompilieren willst dann:

    Die header der dll ins programm include.
    Dadurch kannst du auf die public-funktione zugreifen da die dein program jetzt kennt.

    Weiter musst du die lib mitlinken.

    Beim erstellen einer dll gibt es im grunde 3 dateien

    *.dll
    *.lib
    *.h

    Bei starten des Programmes wird die dll automatisch geladen.
    Der Ordner wo sie sich befindet muss sich im SuchPfad von Windows befinden oder im Ordner des zu startenden Programmes. Zuest wird sie im currendir gesucht und dann in den Ordner der PATH von windows (z.B.: C:\Windows\System32)



  • ARGH!KA was ichö falsch mach...

    Ich hab einfach ein als neues Projekt eine WIN32-DLL datei gemacht.
    (wird ne billige 2D Engine)
    hier eine der 3 Header-Files:

    // 2D.h: Schnittstelle für die Klasse C2D.
    //
    //////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_2D_H__F6DBF136_4AEC_47FE_883D_972CB8085303__INCLUDED_)
    #define AFX_2D_H__F6DBF136_4AEC_47FE_883D_972CB8085303__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    #include<vector>
    
    #include <d3d8.h>
    #include <d3dx8.h>
    #include "Log.h"
    
    #define VERTEXCAPS (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
    
    class __declspec(dllexport) CGFX_Object;
    
    struct VERTEX
    {
        float       x, y, z; // transformierte Koordinaten
        float       rhw;     // für die Tiefenberechnung (Depthbuffering)
        D3DCOLOR    color;   // Farbe
    };
    
    class __declspec(dllexport) C2D  
    {
    private:
        LPDIRECT3D8 lpd3d;                  
        LPDIRECT3DDEVICE8 lpd3dDevice;          
        LPDIRECT3DVERTEXBUFFER8 lpVBpunkt;  // VB für Punkte
        LPDIRECT3DVERTEXBUFFER8 lpVBlinie;  // VB für Linien
        LPD3DXSPRITE lpd3dxSprite;              
        D3DCAPS8 *pd3dCaps;                 // ???
        CLog log;                           // Log_Objekt
        VERTEX* pPunktVertices;
        VERTEX* pLinieVertices;
        VERTEX a_punkt[50];
        VERTEX a_linie[50];
        int anz_pts,anz_lines;
    
        void DrawScene(std::vector<CGFX_Object>&);         // ruft DrawObject für jedes Element im Vektor auf
        void DrawObject(CGFX_Object&);   // GFX-Objekt wird 'gedrawt'   
    
    public:
        C2D();
        virtual ~C2D();
        HRESULT Init_DG(HWND);                      
        void Cleanup_DG();                      
        void Render(std::vector<CGFX_Object>&);                               
        void DrawPixel(int,int,D3DCOLOR);
        void DrawLine(int,int,int,int,D3DCOLOR);
    
        LPDIRECT3DTEXTURE8 LoadTexture(CGFX_Object&);
    
    };
    
    #endif // !defined(AFX_2D_H__F6DBF136_4AEC_47FE_883D_972CB8085303__INCLUDED_)
    

    Dann kompiliert. Keine Fehler.
    Dann hab ich die 3 entstandenen Dateien ( *.dll, *.lib u. *.exp) in den Ordner von meiner normalen WIN32 Anwendung (ein billiges 2D Spiel) kopiert.

    Hab mit Projekte->Dem Projekt hinzufügen->Dateien die *.dll hinzugefügt
    Dann unter Projekt->Einstellungen->Linker die *.lib eingetragen
    Und ganz normal

    #include"2D.h"
    

    in die main.cpp
    geschrieben

    aber:
    E:\-=Eigene Dateien=-\-=Coding=-\C plus plus\-=Projekte=-\Billard\main.cpp(4) : fatal error C1083: Include-Datei kann nicht geoeffnet werden: '2D.h': No such file or directory



  • Sagt doch schon die Fehlermeldung.
    Er findet deine 2D.h nicht welche irgendwo includet wird.
    Und wenn du deine Header so includes dann wirs auch nicht gehen da du dllimport
    deklarieren musst.

    Und wenn jetzt noch die Frage kommt was dllimport ist dann verweise ich dich gleich auf die FAQ bzw. VC++ 6 in 21 Tagen unter www.mut.de zum Onlinelesen.



  • Die 2D.h wird nicht irgendwo includet sondern, wie ich geschrieben hab, in der main.cpp
    Die 2D.h ist eine (die obenstehende) der drei Header Dateien in der DLL

    Sicher, dass man da dllimport verwenden muss?
    Im og. Tutorial inkludiert der Autor die Datei soweit ich sehe genauso wie ich.



  • Ist doch egal wo sie includet wird. SDer Compiler/Linker findet sie nicht.

    "2D.h" suche im aktuellen ordner
    <2D.h> im aktuellen und dann im PATH des VC++

    Zum dllimport : Du solltest nicht immmer klicki/bunti und copy/pasti verwenden ohne zu wissen was und warum du dies tust.

    Beim kompilieren einer dll (und ich meine jetzt nicht das Projekt wo die Klassen oder Funktionen der dll verwendung finden) exportiert man funktionen mit dllexport.

    Beim Project dann selbst werden die Funktionen oder Klassen mit dllimport importiert.

    Die erledigt man normalerweise mit einer

    #ifdef _MEINEFUNKTIONEN_EXPORTS_
    #define MEINEFUNKTIONEN_API __declspec(dllexport)
    #else
    #define MEINEFUNKTIONEN_API __declspec(dllimport)
    #endif
    

    Und in der stdAfx.h des dll-Projektes wird ein

    #define _MEINEFUNKTIONEN_EXPORTS_
    

    geschrieben

    Dadurch kann man die selbe *.h für beide Projekte verwenden.
    Die import/export stehen auch in dem o.a. TUT. Also ist dort nichts falsch sondern du hast es nicht genau gelesen.



  • thnx, genau das wollte ich wissen!

    Zum dllimport : Du solltest nicht immmer klicki/bunti und copy/pasti verwenden ohne zu wissen was und warum du dies tust.

    Ich hab das komplette Tut gelesen, nichts daraus kopiert und dachte, zu wissen, was ich tue

    Die import/export stehen auch in dem o.a. TUT. Also ist dort nichts falsch sondern du hast es nicht genau gelesen

    Es kommt nur nicht direkt (eigentlich überhaupt nicht) so rüber, als bräuchte man dllimport um in einem Projekt eine dll zu verwenden, was auch davon unterstützt wird, dass dies in den Beispielcodes nicht verwendet wird

    4. Importierung und Exportierung innerhalb von DLLs

    Kann ich ja nich riechen, dass man des auch braucht um eine dll zu benutzen

    Alles, was in die DLL reingehen soll, wird als import deklariert.

    In meine dll soll ja nichts reingehen, ich will sie ja nur benutzen

    cYa


Anmelden zum Antworten