kostenloser Webspace werbefrei: lima-city


Eclipse selbes Projekt Cpp(funk. nicht) vs C(funktioniert)

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    dikay

    dikay hat kostenlosen Webspace.

    Hi Leute und zwar habe ich mir ein kleines Beispielprogramm gezogen welches so aussieht:

    Dateien:
    main.c/.cpp
    lib/libmeasure.h
    lib/libmeasure.dll

    .c/.cpp:
    #include <stdio.h>
    #include <stdlib.h>
    #include "libmeasure.h"
    
    int main()
    {
      double ret = 0;
    
      ret  = PCMeasureGet();
      printf("Messwert = %f\n", ret);
      system("PAUSE");
      return 0;
    }


    .h:
    #ifndef _INC_LIBMEASURE_
    #define _INC_LIBMEASURE_
    
    #if BUILDING_DLL
    # define DLLIMPORT __stdcall __declspec (dllexport)
    #else /* Not BUILDING_DLL */
    # define DLLIMPORT __stdcall __declspec (dllimport)
    #endif /* Not BUILDING_DLL */
    
    #define BUFFSIZE 64
    
    #define RET_OK    0 /* Fehlerfreier Aufruf */
    #define RET_WINI  1 /* WinSock Initialisierung fehlgeschlagen */
    #define RET_SOCK  2 /* Fehler bei Anlage des Sockets */
    #define RET_SERV  3 /* Server nicht gefunden */
    #define RET_CONR  4 /* Verbindung vom Server abgelehnt */
    #define RET_IOF   5 /* I/O-Fehler beim Senden oder Empfangen */
    #define RET_CINV  6 /* command ungültig */
    #define RET_TIME  7 /* Timeout */
    
    DLLIMPORT
       int readMeasure(
          const char* server,
          int port,
          int timeout,
          int command,
          char* buff);
    
    DLLIMPORT
       double PCMeasureGet(
          const char* server,
          const char* name);
    
    DLLIMPORT
       int PCMeasureStatus();
    
    DLLIMPORT
       double TestDouble();
    
    DLLIMPORT
       float TestFloat();
    
    
    
    #endif /* _DLL_H_ */


    Konsolenausgabe bei CPP:
    g++ "-LC:\\XXX\\workspace\\MCPP\\lib" -o MCPP.exe main.o -lmeasure
    C:\XXX\workspace\MCPP\Debug/../main.cpp:9: undefined reference to `_imp___Z12PCMeasureGetPKcS0_@8'


    Unter Eclipse versuche ich dieses Projekt mit Hilfe von MinGW zu bauen. Als C Projekt funktioniert das ganze jedoch unter CPP mit genau den selben Einstellungen nicht...
    Es scheint als würde die lib nicht geladen zu werden...
    Nur leider weiß ich nicht was ich nun noch machen soll damit das ganze unter cpp funktioniert...

    WIe ich das ganze integriert habe seht ihr hier: http://eclipsesource.com/blogs/2010/03/03/shared-libraries-with-eclipse-cdt-and-cygwin-on-windows/

    Ich kann mir nicht vorstellen das ganze Verfahren jetzt so von einander abweicht aber anscheinend ja schon...

    Irgendwelche Vorschläge?

    Beitrag zuletzt geändert: 7.6.2013 17:20:22 von dikay
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo dikay,

    Du musst den Header korrekt aufbauen:
    #ifndef _INC_LIBMEASURE_
    #define _INC_LIBMEASURE_
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    #if BUILDING_DLL
    # define DLLIMPORT __stdcall __declspec (dllexport)
    #else /* Not BUILDING_DLL */
    # define DLLIMPORT __stdcall __declspec (dllimport)
    #endif /* Not BUILDING_DLL */
    
    #define BUFFSIZE 64
    
    #define RET_OK    0 /* Fehlerfreier Aufruf */
    #define RET_WINI  1 /* WinSock Initialisierung fehlgeschlagen */
    #define RET_SOCK  2 /* Fehler bei Anlage des Sockets */
    #define RET_SERV  3 /* Server nicht gefunden */
    #define RET_CONR  4 /* Verbindung vom Server abgelehnt */
    #define RET_IOF   5 /* I/O-Fehler beim Senden oder Empfangen */
    #define RET_CINV  6 /* command ungültig */
    #define RET_TIME  7 /* Timeout */
    
    DLLIMPORT
       int readMeasure(
          const char* server,
          int port,
          int timeout,
          int command,
          char* buff);
    
    DLLIMPORT
       double PCMeasureGet(
          const char* server,
          const char* name);
    
    DLLIMPORT
       int PCMeasureStatus();
    
    DLLIMPORT
       double TestDouble();
    
    DLLIMPORT
       float TestFloat();
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* _DLL_H_ */
    Die Lib ist wahrscheinlich mit C geschrieben bzw. verwendet die C Namenskonvention. In CPP werden aber die Argumente und der Rückgabewert in den Funktionsnamen mit eingebaut (-> _imp___Z12PCMeasureGetPKcS0_@8) um Überladungen zu ermöglichen weshalb der Linker die C-Funktionen nicht finden kann. Daher sollte man immer CPP-Guards im Header haben, wenn man eine C-Bibliothek schreibt.

  4. Autor dieses Themas

    dikay

    dikay hat kostenlosen Webspace.

    darkpandemic schrieb:
    Hallo dikay,

    Du musst den Header korrekt aufbauen:
    Die Lib ist wahrscheinlich mit C geschrieben bzw. verwendet die C Namenskonvention.


    Danke für die Hilfe und Erklärung. Ich dachte mir schon das es evtl. ein Problem durch die unterschiedlichen Konventionen gibt, jedoch wusste ich nicht genau welche und wie ich das ganze behebe.
    Es funktioniert nun und ich habe wieder etwas dazugelernt :)
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!