Erstellen einer eigenen DLL Datei unter Windows XP und Header Problem -> undefined Reference



  • Ich wollte heute mal meine eigene DLL Datei erstellen und deren Funktion in einem eigenen C Programm benutzen.

    Doch dummerweise bekomme ich beim Compilieren & Linken mit dem gcc Compiler einen undefined reference Fehler.

    Hier meine 3 Dateien:

    Meine Headerdatei:

    /* testheader.h */
    #ifndef testheader_h
      #define testheader_h
    
      int addTwo(int a, int b);
    
    #endif
    

    Meine Codedatei die den Code der in der Header Datei deklarierten Funktion enthält:

    /* testheader.c */
    #include "testheader.h"
    
    int addTwo(int a, int b)
    {
      return a + b;
    }
    

    Und mein Hauptprogramm in der ich die Funktion nutzen möchte:

    /* mainheadertest.c */
    #include <stdio.h>
    #include "testheader.h"
    
    int main()
    {
      int var_1 = 10;
      int var_2 = 20;
      int ergebnis;
    
      printf("Variable 1 = %i \nVariable 2 = %i \n", var_1, var_2);
      /* printf("Variable 1 + Variable 2 = %i \n", addTwo(var_1, var_2)); */
      ergebnis = addTwo(var_1, var_2);
    
      return 0;
    }
    

    Die DLL Datei habe ich in der Eingabeaufforderung mit folgendem Kommando erstellt:
    gcc -mdll -o testheader.dll --base-file testheader.o

    Und das scheint auch funktioniert zu haben, zumindest habe ich jetzt eine testheader.dll Datei.

    Doch wenn ich das obige Hauptprogramm erstellen will, dann erhalte ich einen undefined Reference Fehler:

    C:\Eigene Dateien\user\LOKALE~1\Temp/ccywbaaa.o:mainheadertest.c:(.text+0x6c): undefined reference to `addTwo'
    collect2: ld returned 1 exit status
    

    Woran liegt das?



  • Die dll datei ist im selben Ordner wie die *.exe ? Und du hast dem Linker die *.lib datei hinzugefügt ? ?



  • jasdjkfs schrieb:

    Die dll datei ist im selben Ordner wie die *.exe ?

    Ja, nur das halt die EXE noch nicht existiert, das erstellen schlägt ja fehl.

    Und du hast dem Linker die *.lib datei hinzugefügt ? ?

    Nein, wie mache ich das?



  • Testheader.h + .c ist die DLL datei.

    Du musst in der Headerdatei angeben welche Funktionen du exportieren willst !

    So sieht ein richtiger Header aus:

    /* testheader.h */
    #ifndef testheader_h
      #define testheader_h
    
      extern int __declspec(dllexport) addTwo(int a, int b);
    
    #endif
    

    Dieser Header gehört zu Testheader.c, wenn du die Datei kompilierst sollte jetzt kein Fehler mehr kommen glaub ich.

    Mainheadertest.c ist jetzt das Programm welches die DLL benutzt, dazu benötigst du den Header testheader.h, mit einem Unterschied:

    /* testheader.h */
    #ifndef testheader_h
      #define testheader_h
    
      extern int __declspec(dllimport) addTwo(int a, int b);
    
    #endif
    

    Hier musst du die Funktion importieren ! (__declspec(dllimport))
    Normalerweise hilft man sich hier mit Präprozessor direktiven, so dass man nur eine Header datei hat und automatisch der richtige Modifier verwendet wird(schau dir mal bsp-codes an).

    Du musst also diese Header-datei includen, die *.lib (oder *.a) dem Linker hinzufügen, und die DLL im selben Verzeichnis wie das Programm. (Die .lib/.a Datei erstellst du beim Kompilieren der DLL Datei).

    Wie du die Datei dem Linker hinzufügst kommt darauf an mit welcher IDE du arbeitest.


Anmelden zum Antworten