Forum: PC-Programmierung Wie verwende ich eine .dll in Eclipse (MinGW)


von Mark M. (mom-jovi)


Lesenswert?

Ich möchte mich in das Thema DLL einarbeiten. Dazu habe ich mir in einem 
Eclipse Workspace 2 C-Projekte angelegt:

1. mydll als Shared Library
2. myappl als Executable

------------------------------------------------
Projekt 1 besteht aus einem Modul "mydll":
1
// file: mydll.h
2
#ifndef MYDLL_H_
3
#define MYDLL_H_
4
5
int mydll_getValue(int n);
6
7
#endif
1
// file: mydll.c
2
#include <stdio.h>
3
#include <stdlib.h>
4
5
#include "mydll.h"
6
7
int mydll_getValue(int n)
8
{
9
  n++;
10
  n *= 5;
11
  return n;
12
}

Dieses Projekt compiliere ich als Release mit den folgenden Shared 
Library Settings:
Shared object Name: libmydll.dll
Import Library Name: libmydll.dll.a
DEF file Name: libmydll.def

Damit erhalte ich im Release-Ordner die entsprechenden .dll, .o, .dll.a 
und .def Dateien.

------------------------------------------------
Projekt 2 hat nur eine Source-Datei:
1
// file: myappl.c
2
#include <stdio.h>
3
#include <stdlib.h>
4
5
#include "mydll.h"
6
7
int main(void){
8
   int val = 0;
9
   puts("!!!Hello World!!!");
10
   printf("5");
11
   //val = mydll_getValue(1);
12
   printf("%d",val);
13
   return EXIT_SUCCESS;
14
}

Die DLL binde ich in Projekt 2 über den Header ein und außerdem bei den 
Linker Einstellungen mit "mydll" (also ohne vorangestelltes lib und ohne 
Endung .dll).

Nun ist es so, dass "myappl" compiliert, aber nur dann läuft, wenn die 
vierte Anweisung in der main auskommentiert ist - dort wo auf die DLL 
zugegriffen wird.
Wenn ich den Funktionsaufruf mydll_getValue(1); drin lasse, dann wird 
das Programm beim Ausführen gleich beendet, sowohl beim Debug als auch 
beim Run. Über der Eclipse-Konsole steht dann:
<terminated> myappl.exe [C/C++ Application] myappl.exe

Wo liegt der Fehler?
Ich habe hier schon gesucht, wie man eine DLL richtig einbindet, aber da 
ist dann immer sehr schnell von Makefiles die Rede...davon habe ich null 
Ahnung.

von Peter II (Gast)


Lesenswert?

Mark M. schrieb:
> Nun ist es so, dass "myappl" compiliert, aber nur dann läuft, wenn die
> vierte Anweisung in der main auskommentiert ist - dort wo auf die DLL
> zugegriffen wird.

kommt eine Fehlermeldung oder was passiert?

Liegt die dll im gleichen Verzeichnis wie die exe?

von Mark M. (mom-jovi)


Lesenswert?

Peter II schrieb:
> kommt eine Fehlermeldung oder was passiert?
Es kommt keine Fehlermeldung. Es sieht so aus, als ob das Programm 
einfach nur ganz schnell durchläuft, da ja kaum was passiert.
Beim Run passiert gar nichts und beim Debug wird in der Konsole wird 
kurz irgendwas angezeigt mit "endianess", aber im nächsten Moment ist es 
wieder weg und es heißt darüber nur "<terminated>...".


Peter II schrieb:
> Liegt die dll im gleichen Verzeichnis wie die exe?
Nein. Die dll liegt im 1. Projektordner, also Workspace/mydll/Release.
Ich habe aber im myappl Projekt Workspace/mydll/Release als Library 
search path angegeben.

Muss ich denn die dll immer in das Verzeichnis der exe verschieben? Und 
die Header auch?
Wenn ich in einem Workspace viele Projekte habe, die voneinander 
abhängig sind, dann ist dass ja immer ne Prozedur...oder ist genau das 
die Aufgabe von Makefiles? Sorry, ich habe da nicht so den Überblick...

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Mark M. schrieb:
> Muss ich denn die dll immer in das Verzeichnis der exe verschieben? Wenn
> ich in einem Workspace viele Projekte habe, die voneinander abhängig
> sind, dann ist dass ja immer ne Prozedur...oder ist genau das die
> Aufgabe von Makefiles? Sorry, ich habe da nicht so den Überblick...

es kommt auf die Umgebung an. dll werden im aktuellen Verzeichnis und 
alles Verzeichnissen der Path variable gesucht. Woher soll dann dein 
Programm wissen wo die dll liegt?

Aber wenn du keine Fehlermeldung bekommst, stimmt etwas anders nicht. 
Wenn eine dll nicht gefunden wird kommt auch ein passender Fehler.

von Mark M. (mom-jovi)


Lesenswert?

Ok. Ich habe nun den Release-Pfad von mydll absolut in der PATH 
Variablen von myappl angegeben. Jetzt kann ich debuggen und der Return 
Wert der dll Funktion ist wie erwartet.

Funktioniert aber nur mit einem absoluten Pfad. Hatte erwartet, dass 
"${workspace_loc:/mydll/Release}" auch gehen würde.

Komischerweise funktionieren die puts und printf Ausgaben nicht, aber es 
gibt auch keine Fehlermeldung. Daher sehe ich beim normalen Run kein 
Ergebnis. Aber das hat wohl eine andere Ursache.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.