Problme beim Library einbinden...



  • Hallo,

    Ein schon oftmals durchgekautes Thema ... ich weiss. Leider fand ich über die Such Funktion auch nichts was mich weiterbrachte!

    Hier nun mein Problem:
    Ich versuche eine alte, von mir erweiterte, Library in mein neues Programm einzubinden. Die Library ist eigtl. in C geschrieben und wurde von mir um 2 C++ Klassen erweitert. Jetzt will ich eben auf diese 2 c++ Klassen von außen zugreifen.
    In der Library habe ich in den 2 Header Files die __declspec(dllexport) Befehle verwendet um die Funktionen als Einstiegspunkte festzulegen.
    In meinem Programm versuche ich die Funktionen simpel mit der __declspec(dllimport) Methode zu importieren.
    Leider bekomme ich vom Compiler immer den "undeclared identifier" Fehler wenn ich die Funktionen verwenden will. Lustigerweise kann der Visual Studio Editor die Symbole aber auflösen und führt mich per f12 immer zur Deklaration der Funktionen innerhalb der DLL.
    Hier zur Veranschaulichung noch die betreffenden Teile meines Codes:
    1. Header File

    #include <afx.h>
    #include "jinclude.h"
    #include "jpeglib.h"
    #include "jerror.h"
    
    /* Expanded data destination object for stdio output */
    
    typedef struct {
      struct jpeg_destination_mgr pub; /* public fields */
    
      FILE * outfile;		/* target stream */
      /*@@@Buffer versuchsweise hier integriert*/
      BYTE* output_jpg;		//Buffer der dekomprimmiert werden soll
      BYTE* outbuffer;		//dekommprimierter Buffer
      JOCTET * buffer;		/* start of buffer */
    } my_destination_mgr;
    
    typedef my_destination_mgr * my_dest_ptr;
    
    /*================================================================================================*/
    
    #define OUTPUT_BUF_SIZE  4096	/* choose an efficiently fwrite'able size */
    
    		void init_destination (j_compress_ptr cinfo);
    
    		BOOL empty_output_buffer (j_compress_ptr cinfo);
    		BOOL empty_output_bufferA (j_compress_ptr cinfo);
    
    		void term_destination (j_compress_ptr cinfo);
    		void term_destination_buffer (j_compress_ptr cinfo);
    
    		__declspec(dllexport)
    			void jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));
    
    		__declspec(dllexport)
    			void jpeg_bufio_dest JPP((j_compress_ptr cinfo, char* buffer, char* filename = NULL));
    

    2. Header File sieht aehnlich aus...
    cpp File aus welchem ich die Funktionen aufrufen will

    #include <afx.h>
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    #pragma comment(lib, "D:\\src\\Testproj\\lib\\JPEGLIB2.lib")
    
    #ifdef __cplusplus
    	extern "C" {
    #endif // __cplusplus
    
    #define BUFFERSIZE 4096;
    
    		__declspec(dllimport) void jpeg_stdio_dest(j_compress_ptr , FILE * );
    
    int main() {
    
    	j_compress_ptr cinfo;
    	FILE * outfile;
    	jpeg_stdio_dest(j_compress_ptr cinfo, FILE * outfile);
    	return 0;
    }
    

    Ich habe sowohl versucht die Library mittels #pragma oder über die Project Settings(zusätzliches include Verzeichnis bzw. Bidliotheken) einzubinden - leider beides ohne Erfolg.
    Ich verwende übrigens VS2005.
    Wahrscheinlich ist mein Problem trivial, aber ich habe irgendwie keinen richtigen Durchblick bei all den Möglichkeiten meine Library einzubinden. Vielleicht weiss jmd wo es dies bzgl. eine gute Anleitung online gibt - MSDN fand ich zu diesem Thema sehr mager bzw. unverständlich.

    Lg und vielen Dank für die Hilfe

    nac_



  • 1. Benutze den Dependency Walker
    2. Exportiere die Funktionen als extern "C"

    http://www.dependencywalker.com/

    Simon



  • Der Dependency Walker zeigt mir leider gar keinen Einstiegspunkt an (No DOS or PE Signature found). Eigentlich sollte die Library aber funktionieren, da ich sie in anderen Projekten verwende...
    Auch wenn ich die Funktionen als Extern definiere funktionierts nicht!

    Vielleicht rührt mein Problem daher, dass ich versuche in eine alte C Lib C++ Code einzufügen. Muss ich hierbei spezielle Konventionen beachten?

    Lg,

    nac_

    p.s. sorry für die späte Antwort - mir kam der Urlaub dazwischen 🙄


  • Mod

    Du verwechselst eine Import LIB mit einem DLL Export.

    Du musst einfach nur die Funktionen verwenden, wie diese im Header stehen.
    Dnan muss die Lib Datei dem Linker bekannt gemacht werden, dass wars. Die ganzen Schlüsselworte __declspec(dllimport) kanst Du Dir sparen, wenn es eine normale Lib ist.

    Achte aberbitte darauf, dass diese statische Lib mit dem selben Compiler erzeugt wurde, wie der mit dem Du jetzt arbeitest.



  • obsolete



  • Ja, das ist eigentlich meine normale Vorgangsweise. Die Library dem Linker in den Project Settings bekannt geben und die Headerdateien inkludieren.
    Die Library wurde ebenfalls mit der selben VS Version erstellt.
    Wenn ich z.B. mit F12 (Go to Declaration) dem Symbol folge wird es gefunden - leider nach dem Linken nicht mehr (das leuchtet mir nicht ein!)

    Hier nochmal die relevanten Teile des Codes:
    (aufrufende Stelle)

    #include <afx.h>
    #include <iostream>
    #include <fstream>
    using namespace std;
    
      int main() {
    
    	j_compress_ptr cinfo;    //struct aus der lib...
    	FILE * outfile;
    	jpeg_stdio_dest(j_compress_ptr cinfo, FILE * outfile);  //funct aus lib
    	return 0;
    }
    

    Headerdatei der Lib:

    #include <afx.h>
    #include "jinclude.h"
    #include "jpeglib.h"
    #include "jerror.h"
    
    struct jpeg_compress_struct {
    /* ... */
    };
    
    typedef struct jpeg_compress_struct * j_compress_ptr;
    /* ... */
    	EXTERN(void)jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));
    

    Ich habe ja eigentlich erst deshalb mit den dllimport/export begonnen, weil ich auf meinem "normalen" Weg keinen Erfolg hatte.

    lg,
    nac_


  • Mod

    1. Kann es sein, dass das Du eine CPP datei hast und die alte LIB in C Code arbeitet? Fehlt en extern "C"?
    2. Hast Du mit Link /VERBOSE auch kontrolliert ob diese LIB auch wirklich vom Linker gefunden wird?



  • Also meine Library scheint der Linker zu finden - zu mindest bekomme ich auch mit Verbose keine zusätzlichen Fehlermeldungen.

    Der erste Punkt scheint mir aber sehr einzuleuchten, da es in der Tat so ist, dass meine Library in altem C Code geschrieben ist. Allerdings habe ich die Library um 2 Interfaces erweitert, welche ich in c++ geschrieben habe.
    Die Interfaces sollen letzendlich auch jene Funktionen seien, auf die ich von außerhalb zugreifen will.

    Vielleicht liegt mein Problem schon bei dem C/c++ Mischmasch. Ich habe meinem C Projekt einfach 2 neue Header + zugehörigen cpp Files beigefügt. In den neuen Header Files habe ich die Funktionen, auf die ich von außerhalb zugreifen will, mit extern deklariert und in den cpp Files, ohne zusätzliche Keywords, implementiert.

    Muss ich dem Compiler irgendwelche zusätzlichen Angaben / defines machen?

    Lg,

    nac_


  • Mod

    Dem Compiler musst Du gar nicht sagen, Du musst nur Deine Funktionen vernünftig deklarieren.

    Wenn es C Code ist in der Lib , dann müssen die Header auch einen extern "C" {} Block um die Deklarationen gesetzt werden, wenn Du diese Lib in einem C++ Programm verwendest.



  • Danke für Deine Mühe! Nun dürfte das linken funktioniert haben!

    lg,

    nac_


Anmelden zum Antworten