我对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.h
,wglew.h
,eglew.h
和glxew.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
是静态库,我所要做的就是链接并与标头一起编译它,但这没用。
答案 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。