问题描述:
在VScode中,写如下的CMakeLists.txt文件
然后编译CMake得到如下结果:
[build] /home/simula/Pro/testcmake/main.cpp:26:对‘glutInit’未定义的引用
[build] /home/simula/Pro/testcmake/main.cpp:28:对‘glutInitDisplayMode’未定义的引用
[build] /home/simula/Pro/testcmake/main.cpp:30:对‘glutInitWindowSize’未定义的引用
[build] /home/simula/Pro/testcmake/main.cpp:32:对‘glutInitWindowPosition’未定义的引用
[build] /home/simula/Pro/testcmake/main.cpp:34:对‘glutCreateWindow’未定义的引用
[build] /home/simula/Pro/testcmake/main.cpp:38:对‘glutDisplayFunc’未定义的引用
[build] /home/simula/Pro/testcmake/main.cpp:40:对‘glutMainLoop’未定义的引用
截图如下:
仔细观察,猜测“未定义的引用”是因为没有识别到glut.h头文件导致。所以定位问题所在:CMakeLists写错了。
解决方法:
# seach
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
# include
include_directories(${OPENGL_INCLUDE_DIRS})
include_directories(${GLUT_INCLUDE_DIRS})
# link
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES})
不但需要用固定的find_package()函数找到OpenGL还需要找到GLUT,这是因为GLUT不是OpenGL的标准内容。
此外找到路径之后,还需要用include_directories()把路径链接进来。
最后链接库。
之后问题解决。
截图如下:
网上其他的导入OpenGL和GLUT的方法基本上都是抄的stackoverflow的方法,这些方法要么老了,要么本来就是解决不了问题的,抄都不知道验证一下再发到网上。
附上我的完整的CMakeLists.txt
注意:这个cmakelists的结构顺序尽量不要变,否则出错
cmake_minimum_required(VERSION 3.0.0)
project(testcmake VERSION 0.1.0)
# seach the library
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
include(CTest)
include_directories(${OPENGL_INCLUDE_DIRS})
include_directories(${GLUT_INCLUDE_DIRS})
enable_testing()
add_executable(testcmake main.cpp)
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES})
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})