problem beim kompilieren eiener linux-bibliothek
-
hallo!
um das problem zu schildern muss ich ein wenig ausholen.
wir haben eine bestehende software (wurde in delphi 5.0 geschrieben) die zur zeit nur auf windows-systemen läuft. diese software müssen wir jetzt jedoch von windwos auf linux "umschreiben", weil wir ein ticketlesegerät ansprechen müssen, wofür es aber nur linux-(fedora/redhat)-treiber gibt.
um das gerät anzusprechen wurden uns die dafür notwendigen C++-Bibliotheken (.so) für linux, header-dateien wo die klassen-deklerationen enthalten sind, sowie der (C++) source einiger demo-anwendungen mitgeschickt.
da wir über kylix nicht direkt auf diese c++ bibliotheken zugreifen können, müssen wir funktionen in eine c++ bibliothek packen, die uns die notwendigen daten (int, string und boolsche variablen) zurückgibt. jedoch haben wir mit der kompilierung dieser c++ bibliothek ziemlich schwierigkeiten. beim ersten versuch haben wir die bibliothek durch den gcc kompiler V 3.3.3 kompilieren wollen, was daran gescheitert ist, weil der compiler __declspec(dllexport) nicht kennt.
genauer wortlaut der fehlermeldung:
- 'dllexport' was not declared in this scope
- ISO C++ forbids decleration of 'declspec' with no typedes weiteren können wir die cpp-dateien nicht mit gcc kompilieren, weil der compiler sonst alle fremden header durchkompilieren möchte und es da ebenfalls wieder probleme gibt. deswegen haben wir bis jetzt mit dem make befehl gearbeitet. was auch wunderbar funktioniert hat, bis auf das problem mit __declspec(dllexport).
der zweite versuch war auf linux suse mit borland kylix (c++) 3.0, wo wir die .so-bibliothek zwar kompilieren konnten aber dafür beim linken probleme bekommen haben (unresolved external (CnReader::~CnReader()) reference from (main.o)).
wir haben schon alle möglichen foren, newsgroups usw durchsucht aber nichts passendes gefunden...
danke im voraus!!!
-
dann deklariere doch die 'declspec' mit dem entsprechenden typen
void declspec(); oder int declspec(); ...
-
unter linux gibts es doch kein dllexport? oder täusche ich mich
so was
#if defined(_WIN32) #if BUILDING_DLL #define DLLSPEC __declspec (dllexport) #else #define DLLSPEC __declspec (dllimport) #endif #elif defined(POSIX) #define DLLSPEC #else #error "Platform not supported" #endif class DLLSPEC Foo { // ... };
-
__declspec(dllexport) ist ein Makro, das in der Windows-Welt benötigt wird, um festzustellen, ob eine Funktion aus einer DLL exportiert werden soll. Umgekehrt gibt es __declspec(dllimport), wenn die Funktion aus einer DLL importiert werden soll, aber das ist ne andere Sache.
In der Linux-Welt braucht man das nicht. Ich schätze, dass
#ifndef __WIN32__ #define __declspec(x) #define dllexport #endif
Am Anfang einer Header-Datei, die überall includet wird, als Workaround ausreichen sollte. Gängige Praxis wäre aber etwas in der Art, wie es miller_m vorschlägt.