PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dev-C++: Linker Problem sowie Fragen zur DLL Anbindung


pajofego
2006-05-11, 20:08:40
Hallo Leute ich habe mal wieder ein/zwei Probleme mit Dev-C++.

Ich habe eigentlich folgendes vor: Ich möchte mit dem freepascal compiler eine DLL für Windows und für die Linux Welt das Pendant dazu compilieren (wie nennt man das eigentlich für die Linus Welt), um dann über ein C++ Progrämmchen darauf zuzugreifen. Und das stehe ich schon vor folgenden Probleme:

1.) Der Zugriff auf die DLL unter Windows ist soweit mir bekannt auf zwei Arten möglich, 1 x statisch und 2. dynamisch: Dazu habe ich folgenden Code versucht zum compiliert zu bekommen.

1.Variante:



#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

extern "C" __declspec(dllimport)int addiere (int zahl1, int zahl2);

int main(int argc, char *argv[])
{

// Brauche ich eigentlich diese Zeile?
int __stdcall addiere(int zahl1, int zahl2);

int Ergebnis;
Ergebnis = addiere(1,1);
cout << Ergebnis << endl;
system("PAUSE");
return EXIT_SUCCESS;
}


2. Variante (nicht von mir)

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

typedef int WINAPI (*myfunc_t)(int z1, int z2);

myfunc_t addiere = NULL;

int main(int argc, char *argv[])
{

HINSTANCE dll;

dll = LoadLibrary("mydll.dll");

if (!dll)
{
cout << "LoadLibrary failed" << endl;
return 0;
}

addiere = (myfunc_t) GetProcAddress( dll, "addiere");

if (!addiere)
{
cout << "GetProcAddress failed" << endl;
return 0;
}
cout << addiere(4, 5) << endl;

FreeLibrary(dll);

return 0;

}


Wenn ich das ganze mit dem Dev-C++ Compiler compilieren möchte, so wirf er mir mehrere Linker Fehlermeldungen:

Ich stelle hier einmal die erste rein, ich denke diese wäre am wichtigsten.

D:/Eigene Dateien/Lazarus/TestDLL/main.cpp:21: undefined reference to `_Z7addiereii@8'

Ich bin bei Dev-C++ so vorgegangen, dass ich unter Projekt, Projekt-Optionen->Parameter->Linker...Die Bibliothek mydll.o, die vom freepascal compiler erstellt wird angegeben habe. Fehlt das noch etwas?

So, wenn ich hoffentlich dank eurer Hilfe das zum Laufen gebracht haben sollte, würde mich interessieren, wie man das ganze für eine Linux Variante realisieren kann. Was ist das Gegenstück zu einer DLL/Library und wie bindet man diese dort ein?

Danke im voraus

Gruß

pajofego

Coda
2006-05-11, 22:29:57
Unter Linux nennt sich das ganze .so (shared object) und kann mittels dlopen etc. verwendet werden.

Gast
2006-05-12, 17:41:03
pajofego[/POST]']Hallo Leute ich habe mal wieder ein/zwei Probleme mit Dev-C++.

Ich habe eigentlich folgendes vor: Ich möchte mit dem freepascal compiler eine DLL für Windows und für die Linux Welt das Pendant dazu compilieren (wie nennt man das eigentlich für die Linus Welt), um dann über ein C++ Progrämmchen darauf zuzugreifen. Und das stehe ich schon vor folgenden Probleme:

1.) Der Zugriff auf die DLL unter Windows ist soweit mir bekannt auf zwei Arten möglich, 1 x statisch und 2. dynamischeine bessere Sprechweise wäre 1. automatisch und 2. manuell, weil dynamisch ist ja beides, es ist ja ne DLL (= Dynamic Linked Library) :)

pajofego[/POST]']

__declspec(dllimport)int addiere (int zahl1, int zahl2);


interessant, daß das unter Dev-C++ akzeptiert wird. Dachte bislang, die Deckel-Speck-Geschichte sei M$ Visual C++ spezifisch.

pajofego[/POST]']

// Brauche ich eigentlich diese Zeile?
int __stdcall addiere(int zahl1, int zahl2);


sollte eigentlich nicht notwendig sein. Die Funktion ist ja schon deklariert. Irgendwo habe ich auch mal gelesen, daß lokale Funktionsdeklarationen verboten seien, und da ich nicht wüßte, was eine lokale Funktionsdeklaration sonst sein sollte, ging ich davon aus, daß damit Funktionsdeklarationen innerhalb einer Funktion gemeint waren.

pajofego[/POST]']
Wenn ich das ganze mit dem Dev-C++ Compiler compilieren möchte, so wirf er mir mehrere Linker Fehlermeldungen:

Ich stelle hier einmal die erste rein, ich denke diese wäre am wichtigsten.

D:/Eigene Dateien/Lazarus/TestDLL/main.cpp:21: undefined reference to `_Z7addiereii@8'

Ich bin bei Dev-C++ so vorgegangen, dass ich unter Projekt, Projekt-Optionen->Parameter->Linker...Die Bibliothek mydll.o, die vom freepascal compiler erstellt wird angegeben habe. Fehlt das noch etwas?Bibliotheken benutzen, die unter anderen Programmiersprachen oder auch nur anderen Compilern erstellt wurden, ist immer ein bißchen kritisch. Hat glaube ich was damit zu tun, daß im compilierten Code Funktionsnamen zuweilen ein wenig abgeändert werden, z.B. mit einem Underscore u.ä. Zu erkennen daran, daß in deiner Linkerfehlermeldung die Funktion _Z7addiereii@8 statt addiere heißt. Öffne mal die Lib in einem Hex-Editor, dort müßtest du die Funktionsname aufgelistet sehen.
Das manuelle Laden der DLL und Verwenden von GetProcAddress ist da glaube ich ungefährlicher.