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
"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.
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
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
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
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
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.
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
Eine eigene Frage?
Dieser Thread ist über 20 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.