Вопрос на использование Cmake с MSYS / MINGW, связывая файлы DLL, используя библиотеку изображений дьявола

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

  •  30-09-2019
  •  | 
  •  

Вопрос

На самом деле я создаю сценарий CMake для локализации библиотеки дьявола с помощью MSIS / MINGW на платформе Win32. Я продлил исход Finddevil Cmake Cmake Script, чтобы рассматривать рут Mingw, когда пытаются найти дьявола:

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, deval.lib и devil.a файлов в подпапке lib root mingw root (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 Skript, библиотека Deval.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 или root приложение, выполняется приложение, но снова не удается в исполнении Cmake, а затем локализовать файлы DLL вместо .Lib ...

У кого-нибудь есть идея, как я мог решить эту проблему? Я был бы глубоко благодарен для любого намека. С наилучшими пожеланиями, христианин

Это было полезно?

Решение

Эта проблема решена. Я собирался искать полное имя библиотеки, т.е. 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."
)

Другие советы

Поместите это в файл CORT CMAKE вашего проекта, чтобы найти первые библиотеки .lib и только тогда .dll .dll.

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

Я предполагаю, что они сделали это, чтобы сэкономить некоторых людей от проблем с бинарными несовместимостью, поскольку Mingw сгенерированные DLL могут использоваться Mingw без файлов .lib. Никакой другой идеи, почему это не поведение по умолчанию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top