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.