如何在Linux中用CMake和Kdevelop编译GLUT + OpenGL项目?

正如标题所说,我似乎无法用OpenGL和Glut构build项目。

我得到了未定义的OpenGL函数参考错误。

我试过了:

project(testas) find_package(OpenGL) find_package(GLUT) add_executable(testas main.cpp) 

但是这不起作用。

有什么build议么?

Solutions Collecting From Web of "如何在Linux中用CMake和Kdevelop编译GLUT + OpenGL项目?"

find_package(OpenGL)会为你找到软件包,但是它并没有将软件包链接到目标。

要链接到库,可以使用target_link_libraries(<target> <item>) 。 另外,还需要设置include directory ,以便链接程序知道在哪里查找内容。 这是通过include_directories完成的。

一个例子CMakeLists.txt会这样做看起来像这样:

 cmake_minimum_required(VERSION 2.8) project(testas) add_executable(testas main.cpp) find_package(OpenGL REQUIRED) find_package(GLUT REQUIRED) include_directories( ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} ) target_link_libraries(testas ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ) 

如果OpenGL对于你的项目来说是必需的,你可以考虑在find_package(OpenGL)之后测试find_package(OpenGL)或者使用REQUIRED ,如果找不到OpenGL ,将停止cmake

有关更多信息和更好的示例:

  • CMake 2.8文档, target_link_libraries
  • CMake 2.8文档, find_package
  • CMake维基: 如何找到图书馆
  • 论坛后的解决方案: cmake和opengl
  • 由swarthmore.edu的 CMake教程

特别是, CMake wikicmake and opengl链接应该足够让你的工作。

我使用这两个cmake文件来构建我的OpenGL项目,并且它们都工作正常。

我只在Deepin Linux下测试这两个cmake文件。 Deepin Linux是一个中国的Linux系统,比如Ubuntu或Debian。

首先是主CMakeLists.txt

 cmake_minimum_required(VERSION 3.1.0) project(project_name) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/CMakemodulees/") find_package(OpenGL REQUIRED) find_package(FREEGLUT REQUIRED) find_package(GLEW REQUIRED) if(NOT ${OPENGL_FOUND}) message("OPENGL not found") endif() include_directories( ${PROJECT_SOURCE_DIR} ${FREEGLUT_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} ) message(${OPENGL_INCLUDE_DIR}) add_executable(${PROJECT_NAME} ${PROJECT_SOURCE_DIR}/filename.cpp) target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARY} ${FREEGLUT_LIBRARY} ${GLEW_LIBRARY} ) 

其次,在CMakemodulees目录下找到GLUT cmake文件

 # Try to find the FREEGLUT library # # FREEGLUT_INCLUDE_DIR # FREEGLUT_LIBRARY # FREEGLUT_FOUND FIND_PATH( FREEGLUT_INCLUDE_DIR GL/freeglut.h GL/gl.h GL/glu.h GL/glew.h ${CMAKE_INCLUDE_PATH} $ENV{include} ${OPENGL_INCLUDE_DIR} /usr/include /usr/local/include ) SET(STORE_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK}) SET(CMAKE_FIND_FRAMEWORK NEVER) FIND_LIBRARY( FREEGLUT_LIBRARY NAMES freeglut_static freeglut glut GL PATH /opt/local/lib ${CMAKE_LIBRARY_PATH} $ENV{lib} /usr/lib /usr/local/lib ) SET(CMAKE_FIND_FRAMEWORK ${STORE_CMAKE_FIND_FRAMEWORK}) IF (FREEGLUT_INCLUDE_DIR AND FREEGLUT_LIBRARY) SET(FREEGLUT_FOUND TRUE) ENDIF (FREEGLUT_INCLUDE_DIR AND FREEGLUT_LIBRARY) IF (FREEGLUT_FOUND) IF (NOT FREEGLUT_FIND_QUIETLY) MESSAGE(STATUS "Found FREEGLUT: ${FREEGLUT_LIBRARY}") ENDIF (NOT FREEGLUT_FIND_QUIETLY) ELSE (FREEGLUT_FOUND) IF (FREEGLUT_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find FREEGLUT") ENDIF (FREEGLUT_FIND_REQUIRED) ENDIF (FREEGLUT_FOUND)