Issue on using CMAKE with MSYS/MinGW linking dll files using DevIL image library
actually i create a CMake script to localize the DevIL library using MSYS/MinGW on win32 platform. I've extend the origin FindDevIL CMake script to regard the MinGW root when try to find DevIL:
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})
The DevIL .dll files are placed in bin subfolder, the DevIL.lib and DevIL.a files in the lib subfolder of MinGW root (c:/mingw). I use find_library() to check if a library exists.
-- 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() returns allways the path to the dll files - but I can't link against this library using 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'
If i remove the dll files and run the cmake skript the DevIL.lib library is localized correctly and i go no linker failures:
-- Detected OpenGL path is : glu32;opengl32
-- Found DevIL includes at: C:/mingw/include/IL
-- Found DevIL library at: C:/mingw/lib/DevIL.lib
But when in this case the applicaton crashes on start up while missing the dll files. If i add them now back to mingw or application root the application runs, but fails again on cmake execution while localize the dll files instead of .lib ...
Has anyone an idea how i could solve this issue? I would be deeply gratefull for any hint. Best regards, Christian
This problem is solved. I've to search for the complete name of the library, i.e. libDevIL.lib in my CMake script. In this case the library is found correctly:
#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."
)
put this into your project's root cmake file, to find first .lib libraries and only then .dll .
IF(WIN32)
SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll)
ELSE()
SET(CMAKE_FIND_LIBRARY_SUFFIXES .a)
ENDIF()
I guess they did it to save some people from binary incompatibility issues, as mingw generated dlls can be used by mingw without .lib files. No other idea why this is not the default behavior.
精彩评论