如何在Linux下用CMake和KDevelopment编写GLUT+OpenGL工程?

zujrkrfu  于 2022-10-18  发布在  Linux
关注(0)|答案(4)|浏览(140)

正如标题所说,我似乎不能用OpenGL和Glut来构建这个项目。
我收到OpenGL函数的未定义引用错误。
我试着去做:

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

但这并不管用。
有什么建议吗?

qvk1mo1f

qvk1mo1f1#

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)之后测试OpenGL_FOUND,或者使用REQUIRED,如果找不到OpenGL,则会停止cmake
有关更多信息和更好的示例:

特别是,CMake wikicmake and opengl链接应该足够让您的工作正常进行。

yptwkmov

yptwkmov2#

在CMake(3.10+)的最新版本中,有一种新的使用OpenGL的方式,即使用所谓的导入目标

cmake_minimum_required(VERSION 3.10)

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

add_dependencies(testas OpenGL::OpenGL)
include_directories(${GLUT_INCLUDE_DIRS} )

target_link_libraries(testas OpenGL::OpenGL ${GLUT_LIBRARY} )

目前,唯一的实际区别似乎是在Linux上(如果可用,在Linux上使用GLVND),但想必这个解决方案应该更适合未来,因为CMake有更多关于您意图的信息,并且其他工具解析您的CMakeFiles将更好地理解依赖关系树。

t1rydlwq

t1rydlwq3#

从最近开始,您可以使用GLUT::GLUT

cmake_minimum_required(VERSION 2.8)

project(testas)

find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} OpenGL::GL GLUT::GLUT)
fiei3ece

fiei3ece4#

我使用这两个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}/CMakeModules/")

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}
)

第二步,在CMakeModules目录下查找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)

相关问题