Newbie-Frage zum Verlinken einer C-Library in C++ Code
-
zuerst: du ist ok
zweitens: eine header datei existiert leider nicht! die dokumentation der schnittstelle beschreibt jedoch, dass die library für c++ und c benutzbar ist / geschrieben wurde.
wie komme ich weiter? wie gesagt, kompiliere ich die datei als C-code, werden die links korrekt gesetzt!die stelle, an der ich die .lib einbinde, ist wie gesagt in den einstellungen des linkers:
Additional Dependencies: (...), $(ROBCAD)/bin/rose_uil.lib
kann ich die header datei ggf. selbst erstellen, oder automatisiert erstellen lassen mittels eines externen tools?
_________________
EDIT:da ich ja weiss, wie die funktion deklariert sein muss, habe ich auch bereits versucht, die funktion in einem header selbst zu deklarieren. jedoch meldet mir der compiler dann einen Error, und zwar, dass ein konflikt bestünde, da die funktion bereits an vorhergehender stelle deklariert worden sei (was ich ziemlich paradox in hinblick auf das problem empfinde)...
-
Du kannst ihn selbst erstellen, indem du alle Funktionsdeklarationen aus deiner Dokumentation raussuchst und in eine Datei reinpackst (vergiss "das extern "C"{...}" drumherum nicht). Oder du fragst (wenn möglich) den Autor der Bibliothek, ob er dir den Header gibt.
-
okay. also konkret dazu:
ich habe nun noch einmal eine header datei erstellt mit folgendem inhalt:
#ifdef __cplusplus extern "C"{ #endif extern int uiRun ( void ); #ifdef __cplusplus } #endif
uiRun ist wie oben beschrieben zu deklarieren.
wenn ich jetzt kompiliere, meldet der compiler (nicht der linker) einen fehler, und zwar:error C2732: linkage specification contradicts earlier specification for 'uiRun'
interpretiere ich das richtig, wenn das bedeutet:
1. die funktion uiRun() wurde von mir falsch deklariert?
-> der fehler in meinem ersten posting lautet dochunresolved external symbol "int __cdecl uiRun(void)" (?uiRun@@YAHXZ) referenced in function _main
- daraus schliesse ich (und auch aus der benutzung im sourcecode), dass meine hier stehende deklaration richtig sein muss?
2. die deklaration fand bereits zuvor einmal statt, nur wo?? ich denke, die funktionsdeklarationen werden nicht gefunden??
-
@Linux-und-Win32-User
Das "zu spät" schrieb ich, da meine Antwort *nach* der Antwort des OPs kam, in der er schrieb, dass er keinen Header hat. Insofern hilft es nicht, wenn ich sage, was in den Header (den er ja nicht hat) zusätzlich rein muss.
-
okay, also der tip mit der header datei hat mich mal auf die suche durch das interne netzwerk geschickt, und siehe da, ich habe doch einige header dateien, die zu der dll gehren, gefunden! (obwohl angeblich keine vorhanden sein sollten
)
ich habe dabei auch eine header datei
ui_prot.h
gefunden, in der besagte funktionen deklariert sind! die deklarationen sind dabei auch schon mit
extern "C"
ummantelt. die schlechte nachricht: leider, wenn ich diese nun einbinde, verändert sich an den fehlermeldungen überhaupt nichts. die funktionen sind angeblich noch immer nicht deklariert. weiss jemand weiter?
-
Offenbar hast du die Funktion doch schon irgendwo in einem anderen Header eingetragen. Klick mal mit der rechten Maustaste auf 'uiRun' und dann auf "gehe zu Deklaration...", um herauszufinden, wo das ist.
-
erstmal danke für eure geduld.
also, ich habe mich nun noch einmal durch das projekt durchgewühlt und etwas bemerkt..
ich versuche, das noch einmal strukturiert wiederzugeben, plus dem, was ich vorher übersehen habe.1. im compiler ist folgendes eingetragen:
C/C++ Compiler/General/Additional include Directories: $(ROBCAD)/rose/inc2. zuvor nicht gesehen: in diesem Verzeichnis befindet sich die besagte Datei "ui_prot.h". Auszug:
#ifndef _ui_prot_h_ #define _ui_prot_h_ #ifdef _cplusplus extern "C" { # ifdef IN # undef IN # define IN const #endif #endif /* _cplusplus */ #ifdef ANSI # define PROTO(s) s # define VA_PROTO(s) s #elif defined(__mips) && (__mips>2) # define PROTO(s) () # define VA_PROTO(s) s #else # define PROTO(s) () # define VA_PROTO(s) () #endif /* init.c */ PUBLIC tBool uiRun PROTO((void )); //<-------------------- hier wird sie deklariert! (...) #undef PROTO #undef VA_PROTO #ifdef _cplusplus # undef IN # define IN } #endif /* _cplusplus */ #endif /* _ui_prot_h_ */
damit muss ich zugeben, bei meiner vorherigen analyse geschlampt zu haben, ihr hattet recht, der header wird eingebunden.
3. in meiner mail.cpp habe ich oben den eintrag:
#include <uipublic.h>
inhalt der uipublic.h:
#include "uitypes.h" #include "ui_prot.h"
damit schliesst sich ja der kreis.
4. zu guter letzt: im linker ist eingetragen (wie bereits vorher genannt):
Input: $(ROBCAD)/bin/rose_uil.lib
Also, zusammenfassend: der Header mit Funktionsdeklarationen wird eingebunden,
die .lib wird eingebunden,
die Code-Kapselung mit "extern "C" " ist auch vorhanden.CStoll hatte damit natürlich recht, die Funktion wurde deklariert, und zwar wie oben beschrieben in der "ui_prot.h", eingebunden durch die "uipublic.h" in meine "main.cpp".
@CStoll: zu deiner bitte, ich klicke mit der rechten maustaste auf die funktion, und dann auf "go to definition", bekomme jedoch die meldung, dass das Symbol uiRun nicht definiert sei (dasselbe wenn ich auf "go to declaration" klicke).
Ideen???
-
-
#ifdef _cplusplus
Ändere das mal nach:
#ifdef __cplusplus
(zwei Unterstriche). Das ist der richtige Namen und auch nur den kennt z.B. der VC 2005.
-
ah, danke erstmal, kann ich erst morgen probieren. ich hoffe, das wirds sein!