Jump to content

[C/C++] DLL Benutzung unter Windows


Recommended Posts

Ich habe die Daten eines Temperatursensors mit den einzelnen angehängten Programmen auslesen und anzeigen lassen. Da ich die Daten aber über einen längeren Zeitraum brauche, habe ich die C- Programme mit den Header-Dateien in einer dynamischen Bibliothek zusammengefasst und wollte mir die Daten ausgeben lassen. Mit einem Linux-Betriebsystem funktioniert es auch, aber ich brauche die Daten für ein Simulation auf einem PC mit einem Windows-Betriebssystem und sobald ich unter Windows mit den gleichen Dateien eine dynamische Bibliothek (DLL) benutzen will, erhalte ich diese Fehlermeldung:

 

C:\Users\Robert\AppData\Local\Temp\ccgVTKz6.o:dsmodel.c:(.text+0x37ff): undefined reference to `ipcon_create'

C:\Users\Robert\AppData\Local\Temp\ccgVTKz6.o:dsmodel.c:(.text+0x3819): undefined reference to `ptc_create'

C:\Users\Robert\AppData\Local\Temp\ccgVTKz6.o:dsmodel.c:(.text+0x3834): undefined reference to `ipcon_connect'

C:\Users\Robert\AppData\Local\Temp\ccgVTKz6.o:dsmodel.c:(.text+0x3876): undefined reference to `ptc_get_temperature'

C:\Users\Robert\AppData\Local\Temp\ccgVTKz6.o:dsmodel.c:(.text+0x38b1): undefined reference to `ptc_destroy'

C:\Users\Robert\AppData\Local\Temp\ccgVTKz6.o:dsmodel.c:(.text+0x38bc): undefined reference to `ipcon_destroy'

C:\MinGW\bin\ld.exe: C:\Users\Robert\AppData\Local\Temp\ccgVTKz6.o: bad reloc address 0x0 in section `.data'

C:\MinGW\bin\ld.exe: final link failed: Invalid operation

collect2.exe: error: ld returned 1 exit status

 

Error generating dymosim.exe.

 

Hat jemand solch einen Fehler schon gesehen?

Vielen Dank im voraus für die Hilfe

 

Grüße

Robert 

bricklet_ptc.c

bricklet_ptc.h

ip_connection.c

ip_connection.h

tinker.c

Link to comment
Share on other sites

Der Fehler "undefined reference" heißt, dass der Linker die Implementierungen der angegebenen Funktionen nicht finden kann.

 

Mir ist nicht klar was du damit meinst, dass du eine DLL verwendest. Aus den Meldungen geht hervor, dass du die Datei dymosim.exe erstellst, das ist aber keine DLL.

 

Das einfachst Vorgehen ist es alle Dateien die du angehängt hast in eine .exe zu kompilieren. du brauchst keine DLL. Das halt ich an dieser stelle nicht für sinnvoll.

 

Ich sehe du verwendest MinGW. Aber welche IDE verwendest du? Oder hast du ein Makefile?

 

Ich denke du musst mal neben dem Code auch die Projektdatei oder das Makefile zeigen, damit ich dir weiterhelfen kann.

Link to comment
Share on other sites

Es gab zwei Versuche. Für die Dateien wurde das Visual Studio verwendet, um die C-Programme zu kompilieren und die DLL zu erzeugen und dann wurde versucht über direkte Befehle in der Kommandozeile die DLL zu erzeugen. Die Fehlermeldung mit den "undefined reference" war immer die gleiche!

 

Ich brauche die DLL, weil ich die Daten in Dymola/Modleica zum simulieren einlesen möchte. Versuche ich die einzelnen Dateien zu kompilieren und auszuführen, kriege ich auch auf dem Bildschirm ein Ergebnis, allerdings kann ich in Dymola nicht .exe Dateien einlesen lassen sondern nur über eine dynamische Bibliothek den C-Code ausführen lassen!

Die Datei dymosim.exe wäre dann die anschließende ausführende Datei der Simulation.

 

Die Projektdatei ist nur weiterführend, denn ohne die DLL kann ich das Projekt nicht starten. Das Projekt ruft dann die DLL auf, aber solange diese nciht erzeugt werden kann satrtet dieses nciht. Wichtig ist ob es denn überhaupt möglich wäre eine dynamische Bibliothek aus den einzelnen Codes zu erzeugen?

Sind die Implementireungen der einzelnen Funktionen nicht normalerweise in den Header Dateien vorhanden??

Link to comment
Share on other sites

Sind die Implementireungen der einzelnen Funktionen nicht normalerweise in den Header Dateien vorhanden??

 

Nein, aber egal.

 

Da du nicht genau genug beschrieben hast, wie du versuchst hast die DLL zu Erstellen und auch keine Projektdatei vorgezeigt hast, kann ich dir nicht erklären wo dein Problem liegt.

 

Stattdessen habe ich deinem Code eine compile.bat beigelegt, die eine DLL erzeugt.

 

Ich habe auch das Problem mit dem stdbool.h Header unter MSVC 2015 behoben.

 

Ich nehme an du hast Visual Studio 2015 installiert.

 

Lade dir alle angehängten Dateien herunter und speicher sie in einem neuen Ordner.

 

Starte über das Startmenu die "Developer-Eingabeaufforderung VS2015".

 

Dort wechselst du in den neuen Ordner und rufst compile.bat auf.

 

Am Ende hast du eine dymosim.dll Datei, die die temp_ptc() Funktion exportiert.

 

Ich hoffe das hilft dir weiter.

bricklet_ptc.c

bricklet_ptc.h

ip_connection.c

ip_connection.h

tinker.c

compile.bat

Link to comment
Share on other sites

  • 2 weeks later...

Ich versuche nochmal die genaue Problematik zu erläutern, da ich mich wohl nicht verständlich ausgedrückt habe.

Um die Tinkerforge-Module mit C zu nutzen, benötigt man mehrere Einzel-Dateien, die man unter Windows wie folgt übersetzt: "gcc -o example.exe *.c -lws2_32 -ladvapi32"

 

Meine Problematik ist, dass man unter Dymola/Modelica externen C-Code nur in folgender Form aufrufen kann:

 

  function temp_ptc
  input String host;
  input Integer port;
  input String uid;
  output Real theta;
  external"C" annotation (
    Library={"dymosim"},
    LibraryDirectory={"modelica://CallExternal/Resources/Library/"},
    IncludeDirectory="modelica://CallExternal/Resources/Library/",
    Include="#include \"tinker.c\"");

end temp_ptc;

 

Es ist somit nicht möglich dem Compiler mitzuteilen, dass er mehrere Dateien nutzen soll. Daher habe ich versucht, dass ganze mit einer dynamischen Bibliothek zu lösen, was unter Linux auch funktioniert hat.

Link to comment
Share on other sites

Ja, ich habe die compile.bat ausgeführt, wodurch eine DLL erstellt wurde. Der Schritt hat super funtioniert. Beim Versuch die DLL in Dymola/Modelica mit der Anweisung aufzurufen habe ich die Fehlermeldung mit den "undefined reference to" erhalten, welche ich am Anfang beschrieben habe.

Link to comment
Share on other sites

Ahh, ich denke jetzt habe ich das Problem verstanden.

 

Sprich du bindest in dem Simulationsprogramm deine tinker.c Datei. Da du da aber nur eine C Datei angeben kannst, hast du aus den Tinkerforge API Bindings Dateien eine DLL erstellt namens dymosim.dll, die du dann mittels der Library={"dymosim"} Zeile einbindest.

 

Diese ganzen Fehlermeldungen in deinem ersten Post, kommen vom Simulationsprogramm das versucht jetzt tinker.c zu kompilieren. Du selbst rufst gar nicht den Compiler auf.

 

Sorry, ich hatte dein Problem total falsch verstanden.

 

Teste mal bitte folgendes: Die angehängte Version der Bindings kommt jetzt mit einem Makefile mit dem man unter Windows mit MinGW eine tinkerforge.dll erstellen kann. Dazu musst du das ZIP entpacken und im source Ordner mingw32-make aufrufen.

 

Der Einfachheit halber habe ich dir diese tinkerforge.dll auch mit angehängt, die du dann anstelle der dymosim.dll verwendest.

 

Die Library={"dymosim"} Zeile änderst du dann zu Library={"tinkerforge"} und brauchst dann auch nur noch deine tinker.c Datei und die entsprechenden .h der Bindings.

tinkerforge_c_bindings_2_1_13_mingw_makefile.zip

tinkerforge.dll

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...