Forum: PC-Programmierung Hilfe bei dev-cpp


von Werner A. (Gast)


Angehängte Dateien:

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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von AndreasH (Gast)


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

von Werner A. (Gast)


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

von Werner A. (Gast)


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

von Werner A. (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Werner A. (Gast)


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

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.