【发布时间】:2012-03-16 15:27:22
【问题描述】:
正如标题所说,我似乎无法使用 OpenGL 和 Glut 构建项目。
我得到 OpenGL 函数的未定义引用错误。
我试过了:
project(testas)
find_package(OpenGL)
find_package(GLUT)
add_executable(testas main.cpp)
但这不起作用。
有什么建议吗?
【问题讨论】:
正如标题所说,我似乎无法使用 OpenGL 和 Glut 构建项目。
我得到 OpenGL 函数的未定义引用错误。
我试过了:
project(testas)
find_package(OpenGL)
find_package(GLUT)
add_executable(testas main.cpp)
但这不起作用。
有什么建议吗?
【问题讨论】:
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 wiki 和 cmake and opengl 链接应该足以让您正常工作。
【讨论】:
/usr/bin/ld: error: cannot find -lOpenGL /usr/bin/ld: error: cannot find -lGLUT
target_link_libraries 输入错误。现在修复它,并检查它是否有效。 :)
OpenGL 或GLUT 没有问题,那么?这种错误表明没有安装GLUT_Xi 和GLUT_Xmu(cmake 没有找到它们)。如果您使用的是 Ubuntu,请查看 this link。如果没有,请尝试为您的系统安装GLUT_Xi 和GLUT_Xmu。
target_link_libraries(testas PRIVATE OpenGL::OpenGL GLUT::GLUT)。然后你真的不需要include_directories() 的东西。那时 cmake_minimum 也应该更新,但我真的不记得最小最小值是多少。我猜那是 3.0,用 3.6 你肯定是安全的。
在最新版本的 CMake(3.10+)中,有一种使用所谓的 IMPORTED 目标来使用 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 上(如果可用,则使用 GLVND),但大概这个解决方案应该更具前瞻性,因为 CMake 有更多关于您的意图的信息,并且解析您的 CMakeFiles 的其他工具将更好地理解依赖树。
【讨论】:
macOS Mojave 10.14.3 与 GitHub 项目 vsthost wtrsltnk
${GLUT_LIBRARIES}(复数)
target_link_libraries( testas ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ),因为 Apple 发布了自己的 OpenGL,没有 OpenGL::OpenGL 目标。
最近你可以使用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)
【讨论】:
我使用这两个 cmake 文件来构建我的 OpenGL 项目,它们都运行良好。
一、主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)
【讨论】: