Paskalski Geschrieben January 16, 2017 at 22:52 Geschrieben January 16, 2017 at 22:52 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.cbricklet_ptc.hip_connection.cip_connection.htinker.c Zitieren
photron Geschrieben January 17, 2017 at 09:31 Geschrieben January 17, 2017 at 09:31 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. Zitieren
Paskalski Geschrieben January 17, 2017 at 10:53 Autor Geschrieben January 17, 2017 at 10:53 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?? Zitieren
photron Geschrieben January 17, 2017 at 12:48 Geschrieben January 17, 2017 at 12:48 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.cbricklet_ptc.hip_connection.cip_connection.htinker.ccompile.bat Zitieren
Paskalski Geschrieben January 26, 2017 at 13:11 Autor Geschrieben January 26, 2017 at 13:11 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. Zitieren
photron Geschrieben January 26, 2017 at 13:43 Geschrieben January 26, 2017 at 13:43 Okay, ich verstehe das Problem. Hast du denn mal getestet, das mit der compile.bat zu kompilieren, wie ich es beschrieben habe? Zitieren
Paskalski Geschrieben January 26, 2017 at 23:39 Autor Geschrieben January 26, 2017 at 23:39 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. Zitieren
photron Geschrieben January 27, 2017 at 09:47 Geschrieben January 27, 2017 at 09:47 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.ziptinkerforge.dll Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.