首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DevIL图像库连接MSYS/MinGW文件的问题

使用DevIL图像库连接MSYS/MinGW文件的问题
EN

Stack Overflow用户
提问于 2010-08-21 20:20:08
回答 2查看 3.5K关注 0票数 0

实际上,我在win32平台上使用MSYS/MinGW创建了一个CMake脚本来本地化DevIL库。我已经扩展了原始FindDevIL CMake脚本,以便在尝试查找MinGW时考虑DevIL根:

代码语言:javascript
复制
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文件位于MinGW根目录(c:/mingw)的lib子文件夹中。我使用find_library()检查库是否存在。

代码语言:javascript
复制
-- 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链接到这个库:

代码语言:javascript
复制
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,则DevIL.lib库已正确本地化,并且没有链接器故障:

代码语言:javascript
复制
-- 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或应用程序根目录,应用程序会运行,但在本地化dll文件而不是.lib时,cmake执行再次失败……

有谁知道我该如何解决这个问题?如果有任何提示,我将不胜感激。致以最好的问候,克里斯蒂安

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-04 00:17:30

这个问题已经解决了。我必须搜索库的完整名称,即CMake脚本中的libDevIL.lib。在这种情况下,可以正确地找到库:

代码语言:javascript
复制
#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."
)
票数 0
EN

Stack Overflow用户

发布于 2012-05-24 23:29:00

将其放入项目的根cmake文件中,首先找到.lib库,然后再找到.dll。

代码语言:javascript
复制
IF(WIN32)
   SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .dll)
ELSE()
   SET(CMAKE_FIND_LIBRARY_SUFFIXES .a)
ENDIF()

我猜他们这样做是为了让一些人避免二进制不兼容的问题,因为mingw生成的dll可以在没有.lib文件的情况下由mingw使用。不知道为什么这不是默认行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3537588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档