使用cmake从源静态链接GLEW

时间:2018-09-23 00:48:36

标签: c++ cmake glew

我对cmake有点陌生,对glew,glfw等完全陌生。我正在关注youtube channel,以了解有关游戏引擎和编程的更多信息。

我的问题是使用cmake在项目中链接静态glew库。

首先,我从http://mcs.une.edu.au/doc/glew-devel/index.html的简短源代码开始。

我通过以下方式进行编译:

cd build; cmake ./cmake; make glew_s

这将使用libGLEW.a将lib目录添加到构建目录中。

我的CMakeLists.txt的简化版本如下:

cmake_minimum_required (VERSION 3.5 FATAL_ERROR)
project (TestProject CXX)

set(CMAKE_CXX_FLAGS "-std=c++11")

###########################
# GLEW
###########################
add_subdirectory(${CMAKE_SOURCE_DIR}/Dependencies/GLEW)
target_link_libraries(${PROJECT_NAME} glew)

Dependencies/GLEW中,我还有另一个CMakeLists.txt

# Add glew source and header files  
file(GLOB_RECURSE glew-lib ${CMAKE_CURRENT_SOURCE_DIR}/lib/*)  
file(GLOB_RECURSE glew-headers ${CMAKE_CURRENT_SOURCE_DIR}/include/GL/*)

add_library(glew ${glew-lib} ${glew-headers})  
target_include_directories(glew PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include/GL")

我将libGLEW.a文件的副本放到lib目录中,并且包含目录是从glew源代码的include目录中复制的。它包含GL目录,该目录包含头文件glew.hwglew.heglew.hglxew.h

运行cmake时出现错误:

CMake Error: Cannot determine link language for target "glew".  
CMake Error: CMake can not determine linker language for target: glew

该问题源代码也有一个带有glew.c的src目录,但是如果我将它放在libs目录中,然后像这样将它包含在Dependencies/GLEW/CMakeLists.txt中:

# Add glew source and header files  
file(GLOB_RECURSE glew-lib ${CMAKE_CURRENT_SOURCE_DIR}/lib/*.c)
file(GLOB_RECURSE glew-headers ${CMAKE_CURRENT_SOURCE_DIR}/include/GL/*)
add_library(glew ${glew-lib} ${glew-headers})
target_include_directories(glew PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")

我得到了错误:

CMake Error: Error required internal CMake variable not set, cmake may
be not be built correctly.  
Missing variable is: CMAKE_C_COMPILE_OBJECT  
CMake Error: Error required internal CMake variable not set, cmake may
be not be built correctly.  
Missing variable is: CMAKE_C_CREATE_STATIC_LIBRARY

最后,我尝试仅在根glew.c中包含CMakeLists.txt和标头,例如:

#########################
# GLEW  
#########################
include_directories("${CMAKE_SOURCE_DIR}/Dependencies/GLEW/lib/")
include_directories("${CMAKE_SOURCE_DIR}/Dependencies/GLEW/include/GL/")

这里cmake将完成,但将无法编译,表示类未命名类型和/或未在此范围内声明。

任何帮助将不胜感激。我的印象是libGLEW.a是静态库,我所要做的就是链接并与标头一起编译它,但这没用。

1 个答案:

答案 0 :(得分:0)

首先,我忘了使用

make install

第一次使用make之后,所以我使用了不正确的libGLEW.a文件。

包含正确的libGLEW.a文件后,我的目录结构为

  

./ Dependencies / GLEW / include / GL / *。h //头文件   ./Dependencies/GLEW/lib/libGLEW.a //源文件

最后,将TopLevel CMakeLists.txt更改为包括:

add_library(glew STATIC IMPORTED GLOBAL)

set_target_properties(glew PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/Dependencies/GLEW/lib/libGLEW.a )
set_target_properties(glew PROPERTIES INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/Dependencies/GLEW/include )

如果我想从较低的CMakeLists.txt(例如/Dependencies/GLEW/CMakeLists.txt)中包含该库,则必须首先从那里导出该库,然后将其导入到顶层CMakeLists.txt文件中。 / p>

现在,为了在项目中使用glew标头,我可以只使用#include。