【问题标题】:Linking error in OpenGL using freeglut in CLion使用 CLion 中的 freeglut 在 OpenGL 中链接错误
【发布时间】:2017-01-22 23:10:07
【问题描述】:

所以,我正在使用 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'

我正在使用带有 CLion 的 MinGW 来完成这个项目。我以为我得到了正确的一切。我将相应的文件移动到 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 和您的环境。

标签: c++ opengl cmake mingw freeglut


【解决方案1】:

我一直在努力解决同样的问题,并通过在 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})

【讨论】:

    【解决方案2】:

    您实际上并未将 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 库目录添加到 library search path(在 target_link_libraries 之前添加):

    link_directories(${OPENGL_gl_LIBRARY})
    

    【讨论】:

    • 我因此得到c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lGL
    • @CacheStaheli 我更新了我的答案。这应该会起作用,因为它会考虑到您的实际环境。
    • 只要我在target_link_libraries 中添加了link_directories 调用以及额外的库(${OPENGL_gl_LIBRARY}),它就运行得非常好。谢谢!
    【解决方案3】:

    重新排序CMakeLists.txt 对我有帮助(&lt;name&gt; 应该相应地替换):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多