مشكلة في استخدام CMake مع MSYS/MINGW ربط ملفات DLL باستخدام مكتبة صور الشيطان

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

  •  30-09-2019
  •  | 
  •  

سؤال

في الواقع أقوم بإنشاء برنامج نصي cmake لتوطين مكتبة الشيطان باستخدام MSYS/Mingw على منصة Win32. لقد قمت بتوسيع نطاق البرنامج النصي finddevil cmake إلى مراعاة جذر 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 و Devil.Lib و Devil.a في المجلد الفرعي Lib من 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 the devil.lib library مترجمة بشكل صحيح ولا أذهب إلى أي فشل رابط:

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

ولكن عندما يتعطل تطبيق Applicaton في هذه الحالة أثناء فقد ملفات DLL. إذا قمت بإضافتها الآن إلى MINGW أو جذر التطبيق ، يتم تشغيل التطبيق ، ولكنه يفشل مرة أخرى في تنفيذ 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."
)

نصائح أخرى

ضع هذا في ملف Cmake للمشروع الخاص بك ، للعثور على مكتبات .LIB أولاً وعندها فقط .dll.

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

أعتقد أنهم فعلوا ذلك لإنقاذ بعض الأشخاص من مشكلات عدم التوافق الثنائية ، حيث يمكن استخدام DLLs المولدة MingW بواسطة MINGW بدون ملفات .LIB. لا توجد فكرة أخرى لماذا هذا ليس السلوك الافتراضي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top