DLL: undefined reference... steht doch in der resource.h??



  • Hi all,
    wie ich euch schon so viel zugespamt habe, mache ich gerade DLLs und stelle (oder würde halt gerne) ein Projekt auf DLLs um.

    das ist mein Problem:

    1.c

    #include "resource.h"
    int bla( void )
    {
      blubb();
    }
    

    2.c

    #include "resource.h"
    int blubb( void )
    {
      printf( "bla" );
    }
    

    resource.h

    int bla( void );
    int blubb( void );
    

    jetzt mache ich

    gcc -shared -o dll/1.dll 1.c -O3 -Wall
    

    und dann kommt

    undefined reference to "blubb"
    

    why? In der header steht doch das es die Funktion gibt... wie sag ich das sie in einer anderen DLL steht, also nciht geladen werden soll?



  • undefined reference to "blubb"
    sagt einem ja auch das die entsprechende lib o.ä. fehlt...



  • Ja das ist klar... aber das soll ja auch so sein... 😃
    Wenn ich nämlich die lib da noch mit einbinde, wird ja jede dll immer größer und ich habe 8 DLLs die sich fast alle gegenseitig nutzen...

    Wie greife ich aus einer DLL auf die Funktion einer anderen zurück, ohne die eine DLL in die andere DLL zu compilen 😕

    [edit]ich mache in der Header aus

    int bla( void );
    int blubb( void );
    

    euinfach

    typedef int (*b)(void);
    b bla;
    typedef int (*bl)(void);
    bl blubb;
    

    dann meckert er nich... dann muss ich noch die funktionen laden udn dann sollte es gehen oder? hoffentlich xD...



  • So dass Programm compiliert, jetzt ist aber was eigenartig... Ich habe ne LRESULT CALLBACK in einer dll und die findet er nicht...

    Können die in eine DLL geschoben werden?

    dll

    LRESULT CALLBACK _WndProc( HWND myWnd, UINT wndMsg, WPARAM wParam, LPARAM lParam )
    

    header

    typedef LRESULT CALLBACK (*WP)(HWND, UINT, WPARAM, LPARAM);
    WP WndProc = NULL;						//LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
    

    prog

    HMODULE prog;
    prog = LoadLibrary( "dll/prog.dll" );
    //...
    if( prog )
    {
        //...
    	printf( "%d\n", GetLastError() );//0
        WndProc = (WP)GetProcAddress( prog, "_WndProc");
    	printf( "%d\n", GetLastError() );//127 == ERROR_PROC_NOT_FOUND
        //...
    }
    

    Jemand ne idee?



  • Ich habe inzwischen 4 solche Funktionen die alle nicht geladen werden können, scheint also daran zu liegen das sie LRESULT CALLBACK sind...

    Weiß da jemand eine Lösung?



  • ich versteh nicht was du willst aber ich sag mal "name mangling"



  • Du musst bloss gegen die import-lib der anderen DLLs linken.
    Diese werden beim Übersetzen zusätzlich generiert, und sollten DllName.lib heissen.

    Wenn du Abhängigkeits-Schleifen hast (A depends on B depends on C depends on A), dann musst du wenigstens eine der DLLs so übersetzen dass erstmal nur die import-lib generiert wird (das geht obwohl die anderen import-libs noch fehlen), und nachdem dann alle import-libs da sind übersetzt du die DLL nochmal normal.



  • Gut... ich habe nichts verstanden...

    Alle Funktionen gehen.. nur die LRESULT CALLBACK nicht...

    War deine Antwort zu diesem Thema? Wenn ja dann bitte erklär sie nochmal.. Habe mit DLLs erst angefangen 😃

    Danke dir für die Antwort!


Anmelden zum Antworten