Problema sull'uso CMAKE con MSYS / MinGW collegamento di file dll utilizzando la libreria immagine Diavolo

StackOverflow https://stackoverflow.com/questions/3537588

  •  30-09-2019
  •  | 
  •  

Domanda

In realtà ho creare uno script CMake per localizzare la libreria Diavolo utilizzando MSYS / MinGW su piattaforma Win32. Ho estendere l'origine di script FindDevIL CMake a considerare la radice MinGW quando cercare di trovare Diavolo:

project (DevILTest)
cmake_minimum_required(VERSION 2.6)

FIND_PACKAGE(OpenGL)
IF(OPENGL_FOUND)
  MESSAGE(STATUS "OpenGL render API found.")
  MESSAGE(STATUS "Detected OpenGL path is : ${OPENGL_LIBRARIES}")   
ENDIF(OPENGL_FOUND)

#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}")

SET (Sources
winmain.cpp
)

SET(CMAKE_VERBOSE_MAKEFILE ON)
SET(IL_INCLUDE_DIR /c/binrev/development/mingw/include)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} 
             ${CMAKE_CURRENT_SOURCE_DIR}/src 
             ${IL_INCLUDE_DIR}
             /usr/include 
             /usr/local/include               
)

add_executable (DevILTest ${Sources})
SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR})
TARGET_LINK_LIBRARIES(DevILTest ${OPENGL_LIBRARIES} ${IL_LIBRARY})

I file dll il diavolo sono collocati in sottocartella bin, i file DevIL.lib e DevIL.a nella sottocartella lib di radice di MinGW (c: / MinGW). Io uso find_library () per verificare se esiste una libreria.

-- 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

Find_libary () restituisce allways il percorso dei file dll - ma non riesco a collegare contro questa libreria usando MinGW:

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'

Se io rimuovere i file DLL ed eseguire il CMake Skript biblioteca DevIL.lib è localizzato correttamente e vado fallimenti linker:

-- Detected OpenGL path is : glu32;opengl32
-- Found DevIL includes at: C:/mingw/include/IL
-- Found DevIL library at: C:/mingw/lib/DevIL.lib

Ma quando in questo caso l'applicaton si blocca in fase di start up, mentre mancano i file DLL. Se aggiungo loro ora di nuovo a MinGW o radice di applicazione viene eseguita l'applicazione, ma non riesce ancora una volta durante l'esecuzione CMake mentre localizzare il file dll invece di lib ...

Qualcuno ha un'idea di come potrei risolvere questo problema? Sarei profondamente gratefull per qualsiasi suggerimento. I migliori saluti, Christian

È stato utile?

Soluzione

Questo problema è risolto. Ho per cercare il nome completo della libreria, vale a dire libDevIL.lib nel mio script CMake. In questo caso, la libreria si trova in modo corretto:

#Determine DevIL library
FIND_LIBRARY(IL_LIBRARY NAMES libDEVIL.lib
     PATH_SUFFIXES lib 
     PATHS c:/mingw
     DOC "The file that corresponds to the base il library."
)

Altri suggerimenti

mettere questo in un file di root cmake del progetto, per trovare prime biblioteche Lib e solo allora dll.

IF(WIN32)
   SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll)
ELSE()
   SET(CMAKE_FIND_LIBRARY_SUFFIXES .a)
ENDIF()

Credo che lo hanno fatto per salvare alcune persone da problemi di incompatibilità binarie, come MinGW generato DLL possono essere utilizzati da mingw senza file .lib. Nessun altra idea del perché questo non è il comportamento di default.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top