正如标题所说,我似乎不能用OpenGL和Glut来构建这个项目。我收到OpenGL函数的未定义引用错误。我试着去做:
project(testas) find_package(OpenGL) find_package(GLUT) add_executable(testas main.cpp)
但这并不管用。有什么建议吗?
qvk1mo1f1#
find_package(OpenGL)将为您找到包,但它不会将包链接到目标。要链接到库,可以使用target_link_libraries(<target> <item>)。此外,您还需要设置include directory,以便链接器知道在哪里查找内容。这是用include_directories完成的。执行此操作的示例CMakeLists.txt如下所示:
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。有关更多信息和更好的示例:
OpenGL
OpenGL_FOUND
REQUIRED
cmake
特别是,CMake wiki和cmake and opengl链接应该足够让您的工作正常进行。
CMake wiki
cmake and opengl
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将更好地理解依赖关系树。
t1rydlwq3#
从最近开始,您可以使用GLUT::GLUT:
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)
fiei3ece4#
我使用这两个cmake文件来构建我的OpenGL项目,它们都工作得很好。
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} )
# 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)
4条答案
按热度按时间qvk1mo1f1#
find_package(OpenGL)
将为您找到包,但它不会将包链接到目标。要链接到库,可以使用
target_link_libraries(<target> <item>)
。此外,您还需要设置include directory
,以便链接器知道在哪里查找内容。这是用include_directories
完成的。执行此操作的示例
CMakeLists.txt
如下所示:如果
OpenGL
对于您的项目是必需的,您可以考虑在find_package(OpenGL)
之后测试OpenGL_FOUND
,或者使用REQUIRED
,如果找不到OpenGL
,则会停止cmake
。有关更多信息和更好的示例:
特别是,
CMake wiki
和cmake and opengl
链接应该足够让您的工作正常进行。yptwkmov2#
在CMake(3.10+)的最新版本中,有一种新的使用OpenGL的方式,即使用所谓的导入目标:
目前,唯一的实际区别似乎是在Linux上(如果可用,在Linux上使用GLVND),但想必这个解决方案应该更适合未来,因为CMake有更多关于您意图的信息,并且其他工具解析您的CMakeFiles将更好地理解依赖关系树。
t1rydlwq3#
从最近开始,您可以使用
GLUT::GLUT
:fiei3ece4#
我使用这两个cmake文件来构建我的OpenGL项目,它们都工作得很好。
我只在Deepin Linux下测试这两个cmake文件。Deepin Linux是一个中国开发的Linux系统,类似于Ubuntu或Debian。
首先,主CMakeLists.txt
第二步,在CMakeModules目录下查找GLUT cmake文件