2011-10-24 1 views
2

У меня есть модуль CMake, чтобы найти FreeGLUT:CMake находит правильную библиотеку, но VC++ пытается связать с чем-то еще

FIND_PATH(FREEGLUT_INCLUDE_DIR NAMES GL/freeglut.h) 
FIND_LIBRARY(FREEGLUT_LIBRARY NAMES freeglut freeglut_static) 

SET(FREEGLUT_LIBRARIES ${FREEGLUT_LIBRARY}) 
SET(FREEGLUT_INCLUDE_DIRS ${FREEGLUT_INCLUDE_DIR}) 

INCLUDE(FindPackageHandleStandardArgs) 
FIND_PACKAGE_HANDLE_STANDARD_ARGS(FreeGLUT DEFAULT_MSG FREEGLUT_LIBRARY FREEGLUT_INCLUDE_DIR) 

MARK_AS_ADVANCED(FREEGLUT_INCLUDE_DIR FREEGLUT_LIBRARY) 

Он отлично работает и находит freeglut_static.lib, когда я произвожу NMake Makefiles на Windows. Я пытаюсь статически FreeGLUT в моей DLL:

FIND_PACKAGE(FreeGLUT REQUIRED) 

ADD_LIBRARY(vti SHARED ${VTI_SOURCES}) 
ADD_DEFINITIONS("-DBUILD_VTI=1 -DFREEGLUT_STATIC=1") 
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${FREEGLUT_INCLUDE_DIRS}) 
TARGET_LINK_LIBRARIES(vti ${FREEGLUT_LIBRARIES}) 

Мой исходный код строит правильно, но когда дело доходит до стадии связующей, VC++ терпит неудачу с:

LINK: фатальной LNK1104 ошибки: не может открыть файл «freeglut.lib»

это странно, так как freeglut.lib нигде не упоминается, что я могу видеть в сгенерированных Makefiles NMake. Он должен попытаться связать с freeglut_static.lib, который CMake находит и устанавливает в FREEGLUT_LIBRARIES.

Что может быть причиной этого?

ответ

2

Это вызвано директивами pragma в коде FreeGLUT (см. Freeglut_std.h). Использование FREEGLUT_STATIC должно действительно исправить это для вас, но я думаю, вы должны передать его CMake без котировок: ADD_DEFINITIONS(-DBUILD_VTI -DFREEGLUT_STATIC)

+0

Да, кавычки были проблемой. Благодаря! –

+0

+1 Ответ был также полезен для меня, хотя у меня была проблема с другой библиотекой, чем FreeGLUT. Я бы посоветовал также опубликовать строки прагмы, вызывающие эту проблему, на этот ответ, поэтому люди, имеющие одну и ту же проблему с другим libarry, могут искать эту конкретную прагму в своей библиотеке. –