在CLion中使用freeglut的OpenGL链接错误

8

我正在使用freeglut来进行一些OpenGL相关的操作,但是我一直遇到“未定义引用”的错误:

CMakeFiles\texture_mapping.dir/objects.a(TextureMapper.cpp.obj): In function `ZN13TextureMapper4initEv':
.../TextureMapper.cpp:20: undefined reference to `glClearColor@16'
.../TextureMapper.cpp:23: undefined reference to `glMatrixMode@4'
.../TextureMapper.cpp:24: undefined reference to `glLoadIdentity@0'
.../TextureMapper.cpp:25: undefined reference to `glOrtho@48'
CMakeFiles\texture_mapping.dir/objects.a(TextureMapper.cpp.obj): In function `ZN13TextureMapper7displayEv':
.../TextureMapper.cpp:45: undefined reference to `glClear@4'
...TextureMapper.cpp:48: undefined reference to `glColor3f@12'
...TextureMapper.cpp:49: undefined reference to `glBegin@4'
...TextureMapper.cpp:52: undefined reference to `glVertex3f@12'
...TextureMapper.cpp:53: undefined reference to `glVertex3f@12'
...TextureMapper.cpp:54: undefined reference to `glVertex3f@12'
...TextureMapper.cpp:55: undefined reference to `glVertex3f@12'
...TextureMapper.cpp:58: undefined reference to `glEnd@0'
...TextureMapper.cpp:61: undefined reference to `glFlush@0'

我正在使用MinGW和CLion进行这个项目。我认为我已经正确地完成了所有步骤。我将相关的文件移动到了MinGW的include文件夹中,还有bin文件夹和lib文件夹。然后,在我的CMakeLists.txt文件中添加了以下内容:

cmake_minimum_required(VERSION 3.3)
project(texture_mapping)
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp TextureMapper.cpp TextureMapper.h Vertex.h ObjParser.cpp ObjParser.h)

add_executable(texture_mapping ${SOURCE_FILES})
target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a)

我链接的库文件是freeglut唯一附带的库文件。

那么,我错过了什么?在编译之前,CLion没有显示任何错误。我甚至可以进入由freeglut提供的头文件中的函数。为什么这些函数在我的程序中没有定义呢?


你的问题与CLion无关,只与CMake和你的环境有关。 - Sergey
3个回答

2

我曾经也遇到过同样的问题,通过在CMakeLists.txt文件中添加以下几行代码来解决:

find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
include_directories(${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})

1
你的项目实际上没有连接OpenGL,因此会出现对OpenGL函数的未定义引用。尝试替换以下代码:
target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a)

使用

target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a GL)

我使用你的CMakeLists.txt和下面的程序复现了你的问题:

#include <GL/gl.h>

int main() {
        glClear(GL_COLOR_BUFFER_BIT);
        return 0;
}

并通过以上替换解决了这个问题。解决方案会自动从我的库路径链接GL库:
$ ls -1 /usr/lib64/libGL.*
/usr/lib64/libGL.la
/usr/lib64/libGL.so
/usr/lib64/libGL.so.1
/usr/lib64/libGL.so.1.0.0

更新

根据this,您有一些变量可以访问您实际的OpenGL库。例如,您可以直接指向OpenGL库文件,如下所示:

target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a ${OPENGL_gl_LIBRARY})

您可以将OpenGL库目录添加到库搜索路径中(在target_link_libraries之前执行):

link_directories(${OPENGL_gl_LIBRARY})

我得到了 c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lGL 这个结果。 - Cache Staheli
@CacheStaheli 我更新了我的回答。这应该可以工作,因为它考虑了你的实际环境。 - Sergey
一旦我加入了link_directories调用,以及在target_link_libraries中添加了额外的库($ {OPENGL_gl_LIBRARY}),它就非常出色地工作了。谢谢! - Cache Staheli

1
重新排序CMakeLists.txt对我很有帮助(应相应更改<name>):
cmake_minimum_required(VERSION 3.10)
project(<name>)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lGL -lGLU -lglut")
set(CMAKE_CXX_STANDARD 17)

add_executable(<name> main.cpp)

find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
include_directories(${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接