Erzeugen einer .dll mit CODEBLOCKS?



  • Kann man mit codeblocks(IDE) eine .dll erzeugen?
    Wenn ja,wie?



  • Hat das was mit der MFC zu tun?
    Wenn nein, wieso ist es dann hier? 👎



  • Dieser Thread wurde von Moderator/in dEUs aus dem Forum MFC (Visual C++) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Natürlich kann man mit Code::Blocks eine DLL erzeugen.
    Der Witz bei Code::Blocks ist allerdings der, daß das Projekt-Template mit dem Namen "Dynamic Link Library", welches du über den Menüpunkt File-->New-->Project auswählen solltest, nicht so komfortabel implementiert ist, wie beim DevC++!
    Wovon rede ich?
    Ganz einfach, wenn du eine DLL erstellt hast, dann willst du die ja normalerweise in mehr als einem Programm verwenden, ansonsten hättest du den DLL-Code auch gleich in dein Executable-Projekt integrieren können. Der Fehler im DLL-Template bei Code::Blocks resultiert nun darin, daß das Template zwar eine CPP-Datei anlegt und du damit auch deine DLL erstellen kannst, sobald du aber dann die DLL in einem Executable-Projekt benutzen möchtest, geht das nicht!
    Warum?
    Ganz einfach, das DLL-Template erstellt leider keine nötige Headerdatei für die DLL. Ohne die schaut der Linker beim Linken deines Executable-Projekts aber blöd aus der Wäsche!

    Dieses DLL-Template ist beim DevC++ genauso gelöst, daß man auch alles erstellt bekommt, was man benötigt (also auch die fehlende Headerdatei!).

    Deshalb hab ich auf deine Frage in der Überschrift meiner Antwort mit einem entschiedenen "Jain" geantwortet. 😃

    Um dir nun zu helfen, habe ich mal zwei Projekte erstellt und poste daraus die drei nötigen Dateien. Diese kannst du dann für die Zukunft als Templates für neue DLLs hernehmen ⚠

    Zuerst die Headerdatei meiner Test-DLL (also Dateiname "Test-DLL.h"):

    #ifndef TEST-DLL_H_INCLUDED
    #define TEST-DLL_H_INCLUDED
    
    #include <windows.h>
    
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT
    #endif
    
    // a sample exported function prototype
    void DLL_EXPORT SomeFunction(const LPCSTR sometext);
    
    #endif // TEST-DLL_H_INCLUDED
    

    Als nächstes die Implementation "Test-DLL.cpp":

    #include "Test-DLL.h"
    
    // a sample exported function
    void DLL_EXPORT SomeFunction(const LPCSTR sometext)
    {
        MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
    }
    
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason)
        {
            case DLL_PROCESS_ATTACH:
                // attach to process
                // return FALSE to fail DLL load
                break;
    
            case DLL_PROCESS_DETACH:
                // detach from process
                break;
    
            case DLL_THREAD_ATTACH:
                // attach to thread
                break;
    
            case DLL_THREAD_DETACH:
                // detach from thread
                break;
        }
        return TRUE; // succesful
    }
    

    Als Letztes noch ein Beispiel-Executable, welches die eine Funktion in der DLL aufruft "DLL-Beispielexecutable.cpp" :

    #include <Test-DLL.h>
    
    int main(int argc, char *argv[])
    {
     SomeFunction("Hochspannungsleitungen schwimmen rosa!");
    
     return 0;
    }
    

    Die zweite Datei (Test-DLL.cpp) kannst du in ein frisches DLL-Projekt bei Code::Blocks integrieren, welches du über die oben beschriebene Art mit dem DLL-Template aus dem Code::Blocks-Menü "File..." erstellst und die dritte (DLL-Beispielexecutable.cpp) in ein frisches "Win32 GUI project". Die Test-DLL.h kommt ins include-Verzeichnis des MinGW und die erstellte DLL ins lib-Verzeichnis des MinGW, bevor du deine DLL-Beispielexecutable.cpp kompilierst.
    Wenn du deine DLL-Beispielexecutable.exe dann starten willst solltest du vorher die DLL ebenfalls ins Verzeichnis kopieren, wo die "DLL-Beispielexecutable.exe" ist, damit alles glatt geht.

    Und nun viel Spaß!! 😃 😃



  • Compiler : GNU GCC Compiler (called directly)
    Directory : C:\Programme\CodeBlocks\Projects\Dll´s\testexe\
    --------------------------------------------------------------------------------
    Switching to target: default
    Linking console executable: C:\Programme\CodeBlocks\Projects\Dll´s\testexe\console.exe
    .objs\main.o:main.cpp:(.text+0x32): undefined reference to `SomeFunction(char const*)'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    0 errors, 0 warnings
    _____________
    libsample.a mitgelinkt (im lib verzeichniss)


Anmelden zum Antworten