Probleme mit dem Linken von DevIL unter CMake i.V.m MinGW

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

Probleme mit dem Linken von DevIL unter CMake i.V.m MinGW

Beitrag von Hellhound »

Hallo zusammen,

aktuell bin ich mit der Windowsportierung unserer Linux-Sourcen beschäftigt. Unter Windows nutze ich MSYS i.V.m. MinGW. Nun bin ich dabei ein CMake Skript für die Anbindung der DevIL Library zu schreiben. Hierfür habe ich das Original CMakeSkript um die Berücksichtiung der MinGW Installationspfade erweitert. Klappt auch soweit.

Ich habe die DevIL .lib und .a Files in meiner MinGW Instalaltion im lib-Verzeichnis, die dlls im bin Verzeichnis abgelegt. Mein Problem ist nun, dass CMake grundsätzlich die dll Dateien lokalisiert sobald ich find_library() aufrufe:

Code: Alles auswählen

-- OpenGL render API found.
-- Detected OpenGL path is : glu32;opengl32
-- Found DevIL includes at: C:/mingw/include/IL
-- Found DevIL library at: C:/mingw/bin/DevIL.dll
Damit kommt jedoch der Linker nicht klar und kann die Referenzen nicht auflösen:

Code: Alles auswählen

Linking CXX executable DevILTest.exe
/C/binrev/development/mingw/bin/g++.exe     "CMakeFiles/DevILTest.dir  /winmain.cpp.obj"   -o DevILTest.exe -Wl,--out-implib,libDevILTest.dll.a -Wl,--ma
32 -lopengl32 DevIL.dll -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
CMakeFiles/DevILTest.dir/winmain.cpp.obj:winmain.cpp:(.text+0xcc8): undefined reference to `_imp__ilOriginFunc@4'
CMakeFiles/DevILTest.dir/winmain.cpp.obj:winmain.cpp:(.text+0xce0): undefined reference to `_imp__ilEnable@4'
CMakeFiles/DevILTest.dir/winmain.cpp.obj:winmain.cpp:(.text+0xcf9): undefined reference to `_imp__ilSetInteger@8'
Wie man sieht bindet er DevIL.dll anstelle von -ldevil ein. Nehme ich die dlls raus aus der MinGW Datei, dann linkt er korrekt und baut auch korrekt die sourcen durch:

Code: Alles auswählen

-- Detected OpenGL path is : glu32;opengl32
-- Found DevIL includes at: C:/mingw/include/IL
-- Found DevIL library at: C:/mingw/lib/DevIL.lib
Aber in diesem Fall fliegt ein Exception beim Starten der Applikation, weil er die Dlls nicht finden kann. Plaziere ich nun die DLL's im Applikationsroot, System32 oder MinGW/bin Verzeichnis startet die Applikation fehlerfrei. Dann fliegt mir allerdings wieder alles beim nächsten Build um die Ohren, weil CMake wieder die dll's lokalisiert ...

Weiß zufällig jemand einen Rat? Ich habe keine Ahnung mehr was ich hier noch machen kann... Übrigens denke ich nicht, dass es daran liegt, dass ich vorkompilierte Libraries benutze denn wenn ich ohne CMake arbeite und die DevIL Libraries direkt beim Kompilieren mit angebe läufts sauber durch...

Gruß
Christian
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Probleme mit dem Linken von DevIL unter CMake i.V.m MinG

Beitrag von kimmi »

Du kannst explizit nach libs suchen wie hier zum Beispiel nach einer D3D9-Library:

Code: Alles auswählen

 FIND_LIBRARY( D3D9_LIBRARY d3d9.lib )
Damit sollte er dir nicht die Dll an deinen Linker übergeben ( hoffe ich ).

Gruß Kimmi
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

Re: Probleme mit dem Linken von DevIL unter CMake i.V.m MinG

Beitrag von Hellhound »

Hmm, werde ich daheim nachher gleich einmal ausprobieren. Ich benutze akutell die unten aufgeführten CMake targets,
ich dachte mit dem PATH_SUFFIXES lib hätte ich dies bereits erschlagen:

Code: Alles auswählen

#Determine DevIL specific header file           
FIND_PATH(IL_INCLUDE_DIR il.h 
      PATH_SUFFIXES include/IL
      PATHS c:/mingw
      DOC "The path the the directory that contains il.h"
)
MESSAGE("Found DevIL includes at: ${IL_INCLUDE_DIR}")

#Determine DevIL library
FIND_LIBRARY(IL_LIBRARY NAMES DEVIL
     PATH_SUFFIXES lib 
     PATHS c:/mingw
     DOC "The file that corresponds to the base il library."
)
MESSAGE("Found DevIL library at: ${IL_LIBRARY}")
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

Re: Probleme mit dem Linken von DevIL unter CMake i.V.m MinG

Beitrag von Hellhound »

So hab's wie versprochen ausprobiert, der Vorschlag bringt leider keinen nennenswerten Erfolg. Hier der aktuelle Aufruf in CMake:

Code: Alles auswählen

#Determine DevIL library
FIND_LIBRARY(IL_LIBRARY
  NAMES DevIL.lib
  PATHS c:/mingw
  DOC "The file that corresponds to the base il library."
)
Zwar linkt er wie Du es korrekt vermutet hast direkt die lib Dateien, aber das Verhalten ist letztendlich identisch. D.h. ohne DLL läuft der Kompiler & Linker durch, aber die Applikation knallt beim starten weil die DLL's fehlen. Zudem erhalte ich nun an der Stelle, wo ich die Libs die gefunden worden sind einbinde folgende Fehlermeldung:

Code: Alles auswählen

Execute: brRenderer.cmake
-- Create Win32 platform dependencies.
-- Create win32 platform demos.
-- Configuring done
CMake Warning at src/brGraphics/CMakeLists.txt:77 (ADD_LIBRARY):
  Cannot generate a safe linker search path for target brGraphics because
  files in some directories may conflict with libraries in implicit
  directories:

    link library [DevIL.lib] in C:/binrev/development/mingw/lib may be hidden by files in:
      C:/binrev/repository/binrevengine/branches/hellhound-dev/lib
    link library [ILU.lib] in C:/binrev/development/mingw/lib may be hidden by files in:
      C:/binrev/repository/binrevengine/branches/hellhound-dev/lib

  Some of these libraries may not be found correctly.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Probleme mit dem Linken von DevIL unter CMake i.V.m MinG

Beitrag von kimmi »

Was sagt Depends, wenn du deine Anwendung checkst? Vielleicht fehlt da irgendwas beim impliziten Laden?
Und diese Zeile macht mich stutzig:

Code: Alles auswählen

Cannot generate a safe linker search path for target brGraphics because
files in some directories may conflict with libraries in implicit
directories:

link library [DevIL.lib] in C:/binrev/development/mingw/lib may be hidden by files in:
C:/binrev/repository/binrevengine/branches/hellhound-dev/lib
link library [ILU.lib] in C:/binrev/development/mingw/lib may be hidden by files in:
Hast du da vielleicht verschiedene Konfigurationen durcheinandergebracht?

Gruß Kimmi

P.S.:
http://www.dependencywalker.com/ <- Depends
Benutzeravatar
Hellhound
Beiträge: 53
Registriert: 23.08.2010, 10:00
Wohnort: Braunschweig
Kontaktdaten:

Re: Probleme mit dem Linken von DevIL unter CMake i.V.m MinG

Beitrag von Hellhound »

Es läuft :D Ich war genauso skeptisch wie Du bzgl. dieser einen Zeile, zumal dies nur das Zielverzeichnis ist, wo er meine libs plaziert und ich der Einfachheit halber auch die exe inkl. dll's geparkt hatte ... Hab daher mein komplettes MinGW noch mal neu aufgesetzt und siehe da, plötzlich läuft es mit Deinen angaben in der Suche ohne mit den dll's in Konflikt zu geraten. Vermute mal ich hab durch das viele hin und her evtl. die dll Versionen vertauscht, so dass lib und dll nicht mehr konform waren, was auch die Fehlermeldung erklären würde...

Danke noch mal für die exellente und schnelle Hilfe :!:
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Probleme mit dem Linken von DevIL unter CMake i.V.m MinG

Beitrag von kimmi »

Keine Ursache, wir helfen gern :).

Gruß Kimmi
Antworten