CodeBlocks: Probleme mit .lib linken?

Ryu1991

Erfahrenes Mitglied
Hi, ich benutze eigentlich seit ich programmiere Code::Blocks mit MinGW.
Das linken diverser Bibliotheken hat immer super funktioniert, aber wenn ich zurück denke waren das immer nur .a Dateien. Ich versuche schon seit Stunden Image-libs zu linken, aber vergebens. Ich habe Sowohl mit der Der DevIL-Bibliohtek, als auch mit der Magick++ - Bibliothek inzwischen für mich zweckmäßigen Quellcode produziert.
Aber beide bekomm ich nicht gelinkt. Ich bekomme immer undefined references.

Ich habe den Lib ordner eingetragen, und die Libs bei den Build-Options ausgewählt.
Ich habe es erst normal, nur durch das eintragen des namens versucht.: undefined reference. Dann mit -l<name>, dann kam cannot find -l-l<name>, und wenn ich es mit absoluten oder relativen pfaden probiert habe, wieder undefined references.
Jetzt wollte ich mal fragen, ob einer von euch ähnliche Probleme hatte, und sie gelöst bekommen hat und wenn ja wie?
 
Hi.

Was sind das für .lib Dateien? Statische oder .lib Dateien für DLLs? Falls letzteres mußt du den Code mit __declspec(dllimport) einbinden. Hast du das gemacht?

Ansonsten lass dir mal die Symbole der .lib Dateien ausgeben (mit nm file.lib). Werden dort exakt die Symbole aufgelistet die auch beim Linken als undefiniert erkannt werden oder gibt es Unterschiede?

Gruß

PS: Was sonst noch relevant wäre ist der Aufruf des Compilers mit allen Argumenten (kannst du in Codeblocks einstellen).
 
Zuletzt bearbeitet:
Es sind in beiden Fällen DLLs dabei. Wo muss man das __declspec(dllimport) denn einfügen?
Ich meine normaler weise ja im Header, vor die funktionsdefinition, oder?
Aber ich werde ja wohl kaum bei um 100 Funktionen selber das einfügen müssen,oder?
 
Es sind in beiden Fällen DLLs dabei. Wo muss man das __declspec(dllimport) denn einfügen?
Ich meine normaler weise ja im Header, vor die funktionsdefinition, oder?
Aber ich werde ja wohl kaum bei um 100 Funktionen selber das einfügen müssen,oder?
Nein. Normalerweise gibt es ein Makro welches verändert werden muss wenn man die DLL baut bzw. die DLL Funktionen nutzen will oder eine statische Bibliothek erstellen möchte.

Bei der DevIL Bibliothek wird das ordnungsgemäß gemacht (http://openil.svn.sourceforge.net/v...vIL/include/IL/il.h?revision=1547&view=markup Zeile 475).

Allerdings ist C++ Code in DLLs in der Regel nicht compilerübergreifend nutzbar. Aber schau mal hier http://www.softgames.de/forum/frage103609.html

Evlt. wäre es einfacher die Bibliothek selbst zu erstellen? Wie ich gesehen habe verwendet DevIL CMake, das ein ziemlich gutes Buildsystem ist welches auch CodeBlocks Projektdateien generiert.

Gruß

\edit: Ich hab grad devIL mal ausprobiert und wenn du die devIL.lib direkt (nicht unter Bibliotheken) angibst funktioniert es. (zumindest konnte ich die ilInit() aufrufen.
 
Zuletzt bearbeitet:
Erst mal danke, aber dummer weise geht es immer noch nicht. Denn jetzt bekomme ich "C:\Libs\Devil/DevIL.dll: file not recognized: File format not recognized", egal ob ich das ganze mit dem Parameter -k oder ohne mache :(
 
Erst mal danke, aber dummer weise geht es immer noch nicht. Denn jetzt bekomme ich "C:\Libs\Devil/DevIL.dll: file not recognized: File format not recognized", egal ob ich das ganze mit dem Parameter -k oder ohne mache :(
Poste genau was du eingegeben hast und was dann die Ausgabe war.

Beachte auch mein edit im letzten Post.

Gruß
 
Also ich habe zuerst reimp.exe und dlltool.exe in den DevIL-Ordner kopiert.

Dann Ausführen->cmd:
cd C:\Libs\DevIl
reimp -d DevIL.lib
dlltool --input-def DevIL.def --dllname DevIL.dll --output-lib DevIL.a -k

so sah die Konsole aus. Es gab keine Ausgaben.
Was meinst du denn mit direkt angeben?


Ach ja, ich wollte noch anmerken, bei Magick, da habe ich auc hne undefined reference, aber nicht zu sonem komischen namen mit nem @ drinn, wie bei DevIL, sondern so eine: undefined reference to `Magick::Image::Image(std::string const&)'|

gruß Ryu1991
 
Also ich habe zuerst reimp.exe und dlltool.exe in den DevIL-Ordner kopiert.

Dann Ausführen->cmd:
cd C:\Libs\DevIl
reimp -d DevIL.lib
dlltool --input-def DevIL.def --dllname DevIL.dll --output-lib DevIL.a -k

so sah die Konsole aus. Es gab keine Ausgaben.
Dann wurde doch sicher eine DevIL.a Datei erzeugt oder nicht?
Was meinst du denn mit direkt angeben?
Direkt mit absolutem Pfad in "Andere Linker Optionen" eintragen.

Ach ja, ich wollte noch anmerken, bei Magick, da habe ich auc hne undefined reference, aber nicht zu sonem komischen namen mit nem @ drinn, wie bei DevIL, sondern so eine: undefined reference to `Magick::Image::Image(std::string const&)'|
Wie gesagt, C++ Code ist relativ unverträglich in DLLs. Falls das mit einem anderen Compiler erstellt wurde wird es vermutlich nichts werden das zu linken.

Gruß
 
Ja, die DevIL.a wurde erzeugt. Ich habe sie auch eingetragen, und er hat auch nichts von wegen, finde sie nicht gebracht.
Auch wenn ich sie bei andere Linker-Optionen angebe, kommen die undefined references, egal ob ich die .lib oder .a angebe
 
Wie wird der Compiler aufgerufen?
Code:
gcc -o xzy xyz.c /Libs/devil/lib/devil.lib
funktioniert für
C:
#include <il/il.h>

int main(int argc, char *argv[])
{
    ilInit();
    return 0;
}
Gruß
 
Zurück