未定义引用'[来自GLEW库的各种事物]'
这是我的CMakeLists.txt:
cmake_minimum_required(VERSION 3.7)
project(newerOpenGLTest)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(newerOpenGLTest ${SOURCE_FILES})
find_package(OpenGL)
# tell it where to look for glew
set(CMAKE_PREFIX_PATH "F:/glew-2.0.0")
set(CMAKE_LIBRARY_PATH "F:/glew-2.0.0/lib/Release/x64")
find_package(GLEW REQUIRED)
if (GLEW_FOUND)
message(${GLEW_INCLUDE_DIRS})
message(${GLEW_LIBRARIES})
# Detect and add SFML
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
#Find any version 2.X of SFML
#See the FindSFML.cmake file for additional details and instructions
find_package(SFML 2 REQUIRED graphics window system)
if(SFML_FOUND)
include_directories(
${GLEW_INCLUDE_DIRS}
${SFML_INCLUDE_DIR}
)
target_link_libraries(
newerOpenGLTest
${GLEW_LIBRARIES}
${SFML_LIBRARIES}
${SFML_DEPENDENCIES}
${OPENGL_gl_LIBRARY}
)
endif()
endif()
这是Cmake的输出:
F:/glew-2.0.0/include
F:/glew-2.0.0/lib/Release/x64/glew32.lib
-- Found SFML 2.4.2 in F:/SFML-2.4.2 for GCC 6.1.0 MinGW (SEH) - 64-bit/include
-- Configuring done
-- Generating done
-- Build files have been written to: F:/Users/Doug/CLionProjects/newerOpenGLTest/cmake-build-debug
那里的一切看起来都很好。它找到GLEW并找到包含文件和库的位置。
这是我的main.cpp:
#include <GL/glew.h>
#include <SFML/Window.hpp>
int main() {
sf::Window window(sf::VideoMode(800, 600), "openGL");
window.setVerticalSyncEnabled(true);
window.setActive(true);
// Initialize GLEW
glewExperimental = true;
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
return -1;
}
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
bool running = true;
while (running) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
running = false;
}
}
}
return 0;
}
以下是链接的输出:
Linking CXX executable newerOpenGLTest.exe
CMakeFiles\newerOpenGLTest.dir\build.make:100: recipe for target 'newerOpenGLTest.exe' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/newerOpenGLTest.dir/all' failed
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/newerOpenGLTest.dir/rule' failed
Makefile:117: recipe for target 'newerOpenGLTest' failed
CMakeFiles\newerOpenGLTest.dir/objects.a(main.cpp.obj): In function `main':
main.cpp:xx: undefined reference to `__imp_glewExperimental'
main.cpp:xx: undefined reference to `__imp___glewGenVertexArrays'
main.cpp:xx: undefined reference to `__imp___glewBindVertexArray'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [newerOpenGLTest.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/newerOpenGLTest.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/newerOpenGLTest.dir/rule] Error 2
mingw32-make.exe: *** [newerOpenGLTest] Error 2
对3个GLEW元素的未定义引用。
请注意,它没有说undefined reference to '__imp_glewInit'
所以它连接了一些GLEW,但不是一切。
我运行glewinfo.exe
,输出为glGenVertexArrays: OK
我认为这意味着我的驱动程序支持该功能。
答案 0 :(得分:0)
显然,GLEW网站上的二进制文件仅适用于Visual C ++。
如果你想在MinGW中使用它,你必须自己编译。
从这里复制的说明:
1)下载GLEW源文件。除非你使用Visual Studio,否则不要下载32 / 64bit窗口二进制文件,如果你使用的话,你就不会阅读它。
2)下载,安装和更新msys2。不幸的是,我没有找到一种方法来编译GLEW(对于mingw-w64)没有它,但相信我,它是无痛的,一旦你完成了,你不需要msys2,我们只是用它来编译GLEW lib文件。在执行任何其他操作之前,请按照官方msys2站点上的更新说明进行操作。它只有3步长。
警告:由于某些奇怪的原因,一旦通过第二个更新步骤,msys2命令提示符快捷方式将停止在我的计算机上运行。只需导航到c:/ msys2文件夹并运行msys2_shell.cmd(如果有)。
3)msys2你需要mingw-w64。一些Stack Overflow答案建议下载64位和32位版本的mingw,但由于我不是这方面的专家,它变成了一个痛苦,所以我最好只是下载64位版本,这是我正在使用和目标。在msys2 cmd提示符下运行以下cmd:$ pacman -S gcc make mingw-w64-x86_64-gcc
3-a)msys2需要make和gcc。在msys2 cmd行中运行:$ pacman -S gcc make
4)完成下载mingw-w64,gcc和make后。你已经准备好编译GLEW了。解压缩先前下载的源文件,并将其放入C:\ msys64 \ home \ yourusername文件夹中。
5)打开msys2 cmd提示符,导航到glew2.x.x文件夹并按以下顺序运行以下CMD(每个CMD完成后): 5-a)制作 5-b)进行安装 5-c)make install.all
6)你可能会收到一些错误和警告,不用担心。查看glew2.x.x文件夹中的lib文件夹,您将看到您需要的lib文件。
7)将glew32.dll复制到程序可执行文件所在的文件夹中,并将libglew32.a复制到程序的lib文件夹中。