在 CLion 中使用 freeglut 在 OpenGL 中链接错误
Linking error in OpenGL using freeglut in CLion
所以,我正在使用 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 提供的头文件中的函数。那为什么我的程序里没有定义这些函数呢?
您实际上并没有 link 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;
}
并用上面的替换解决了它。该解决方案自动从我的库路径 links 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})
我一直在努力解决同样的问题,并通过将以下行附加到 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})
重新排序 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})
所以,我正在使用 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 提供的头文件中的函数。那为什么我的程序里没有定义这些函数呢?
您实际上并没有 link 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;
}
并用上面的替换解决了它。该解决方案自动从我的库路径 links 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})
我一直在努力解决同样的问题,并通过将以下行附加到 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})
重新排序 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})