Eclipse selbes Projekt Cpp(funk. nicht) vs C(funktioniert)
lima-city → Forum → Programmiersprachen → C/C++ und D
anlage
bibliothek
code
double
einstellung
empfangen
fehler
fehlerfreier aufruf
header
hilfe
korrekt aufbauen
not
pause
port
projekt
senden
server
unterschiedlichen konventionen
url
verbindung
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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.
-
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 :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage