www.mikrocontroller.net

Forum: PC-Programmierung Hilfe bei dev-cpp


Autor: Werner A. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,
ich versuche den angehängten Code mit dev-cpp (4.9.9.2 mit mingw) zu
compilieren. Das klappt aber nicht. Ich bekomme nur Hinweise auf
undefined reference...
Ich denke, das liegt daran, das ich  die Libary irgendwie mit einbinden
muss. Das lib-file habe ich schon in das dev-cpp\lib Verzeichnis
kopiert, hat aber nicht funktioniert.
Bekommt irgendwer den angehängten Code mit dev-cpp kompiliert, oder
geht das evt. gar nicht?
Danke schonmal
  Werner

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"undefined reference" ist keine Meldung des Linkers, sondern eine
Meldung des C/C++-Compilers. Wahrscheinlich hast Du irgendeine
Headerdatei nicht eingebunden.
Natürlich ist es damit nicht erledigt; Du musst obendrein die Library
zu Deinem Projekt dazulinken, sonst gibt es eine Fehlermeldung
"undefined symbol", die in diesem Falle vom Linker ausgegeben wird.
Um die Library zu Deinem Projekt dazuzulinken, genügt es nicht, die in
irgendein Verzeichnis zu kopieren, sondern sie muss explizit im
Makefile angegeben werden.

In solchen Fällen ist es übrigens hilfreich, die genaue Fehlermeldung
anzugeben und nicht nur vage zu beschreiben.

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal auf die Schnelle drüber gesehen. Zum Kompilieren hatte ich
keine Zeit. Da hättest Du die Projektdatei (Projektname.dev) mitgeben
müssen.

Da ist eine dsp-Datei drin. Das riecht immer nach Visual-C++.
Steht auch drin, dass die mit "Microsoft Developer Studio" erstellt
wurde.
Du musst in den Projektoptionen angeben welche libs Du benutzt.
Das wird aber in diesem Fall mit dem dev-cpp nicht gehen. Der benutzt
den gcc. Die libs, die Du dabei hast sind aber wohl mit Visual-C++
erstellt.

Grüße
Andreas

Autor: Werner A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke soweit.
Wenn ich das richtig verstanden habe muss ich ein neues Projekt anlegen
und da die Libary mit einbinden. Bisher hatte ich nur das C-File
geöffnet und dann kompiliert.
Gib es eine Möglichkeit dev-cpp die in DLL benutzen zu lassen?
Ich werd auf jeden Fall morgen erstmal ausprobieren, ob ich das mit dem
Projekt hinbekomme.

Werner

Autor: Werner A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
so, ich habe mal ein Projekt erstellt. Unter den Projektoptionen habe
ich bei dem Linker die dll mit eingetragen. (die lib dateien haben
anscheinend das falsche Format)
Das Projekt läßt sich jetzt kompilieren. Leider funktioniert die
Anwendung nicht, d.h. ich kann die Anwendung starten und Parameter
übergeben, leider wird keine CAN Message gesendet. Es gibt aber auch
keine Fehlermeldungen.
Deshalb nochmal die Frage, kann ich eine DLL so mit einbinden, oder
muss ich eine lib Datei im passenden Format haben?
Werner

Autor: Werner A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nochmal, soweit ich das bisher verstanden habe, muss ich aus der dll
eine Definitionsdatei generieren (lassen) und aus dieser kann ich dann
eine Libary erzeugen die ich mit einbinden kann.
In der beigelegten Datei habe ich gelesen, das sie das module
defination file mit impdef.exe (von Borland) erzeugt haben, und dass
dann mit lib.exe in eine ".lib" Datei konviert haben.
Könnte mir dabei jemand helfen?
mfg
  Werner

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Erzeugen einer Importlibrary ist eine Möglichkeit, mit einer DLL
umzugehen. Ein anderer Weg, der keine externen Hilfsmittel erfordert
und obendrein ein "gnädigeres" Verhalten der Anwendung im Fehlerfalle
(DLL fehlt) ermöglicht, besteht darin, die DLL mit LoadLibrary zu laden
und mit GetProcAddress die relevanten Funktionspointer zu bestimmen.

Der Aufruf der Libraryfunktionen erfolgt danach über die so bestimmten
Funktionspointer.

Am Beispiel einer DLL mit einer Funktion mit dem Klartextnamen
"Init", die einen int zurückliefert und zwei char-Pointer als
Argument erwartet, ist hier der Gebrauch von LoadLibrary und
GetProcAddress zu sehen:


Typedef für Funktionspointer:

  typedef int (__stdcall *t_initfunc)(char*, char*);

Funktionspointer

  t_initfunc pInitfunc;

Laden der DLL:

  HINSTANCE hModule;

  hModule = LoadLibrary("meinedll.dll");

  if (!hModule)
  {
    // fehlerbehandlung
  }


Funktionspointer bestimmen:

  pInitfunc = (t_initfunc) GetProcAddress(hModule, "Init");

  if (!pInitfunc)
  {
    // fehlerbehandlung
  }

Funktion aufrufen:

  int ergebnis;

  ergebnis = pInitfunc("bla", "fusel");


Nach Gebrauch kann die DLL auch wieder freigegeben werden:

  FreeLibrary(hModule);

Der beim Aufruf von GetProcAddress gebrauchte Klartextname ist der in
der DLL stehende Klartextname des exportierten Symbols. Eine Liste der
von einer DLL exportierten Symbole erhält man mit

  Dumpbin /exports meinedll.dll

Dumpbin gehört zum Lieferumfang von Microsoft-Compilern, es wird aber
sicherlich auch alternative Tools geben, die diese Aufgabe übernehmen
können.

Autor: Werner A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus, ich glaube das übersteigt meine Programmierkenntnisse um
einiges... Mit Pointern stand ich früher schon auf Kriegsfuss ;-)
Ich denke, ich muss mir was anderes überlegen.
Trotzdem besten Dank für die Unterstützung.

Werner

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.