Проблема при использовании CMAKE с MSYS/MinGW, связывающей dll-файлы с использованием библиотеки изображений DevIL
На самом деле я создаю сценарий CMake для локализации библиотеки DevIL, используя MSYS/MinGW на платформе win32. Я расширил исходный скрипт FindDevIL CMake для учета корня MinGW при попытке найти 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})
Файлы DevIL .dll помещаются в подпапку bin, файлы DevIL.lib и DevIL.a в подпапку lib корня MinGW (c:/mingw). Я использую find_library(), чтобы проверить, существует ли библиотека.
-- 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 () всегда возвращает путь к файлам DLL - но я не могу связать эту библиотеку с помощью 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'
Если я удаляю dll-файлы и запускаю скрипт cmake, библиотека DevIL.lib локализуется правильно, и у меня нет ошибок компоновщика:
-- Detected OpenGL path is : glu32;opengl32
-- Found DevIL includes at: C:/mingw/include/IL
-- Found DevIL library at: C:/mingw/lib/DevIL.lib
Но когда в этом случае приложение падает при запуске, пропуская DLL-файлы. Если я добавлю их сейчас обратно в mingw или корень приложения, приложение запустится, но снова не сможет выполнить cmake при локализации dll-файлов вместо.lib...
Кто-нибудь знает, как я мог решить эту проблему? Буду глубоко признателен за любую подсказку. С наилучшими пожеланиями, Кристиан
2 ответа
Эта проблема решена. Я должен искать полное имя библиотеки, то есть libDevIL.lib в моем скрипте CMake. В этом случае библиотека найдена правильно:
#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."
)
Поместите это в корневой файл cmake вашего проекта, чтобы найти сначала библиотеки.lib и только потом.dll.
IF(WIN32)
SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll)
ELSE()
SET(CMAKE_FIND_LIBRARY_SUFFIXES .a)
ENDIF()
Я думаю, что они сделали это, чтобы спасти некоторых людей от проблем с двоичной несовместимостью, так как сгенерированные mingw dll могут использоваться mingw без файлов.lib. Нет другой идеи, почему это не поведение по умолчанию.