由于我一直在学习 C 和 C++,因此我开始使用 SDL2 来可视化我正在编写的程序。我使用 Visual Studio Code,因为我喜欢它的外观,而且我不想使用 IDE,我使用命令行 (gcc/g++) 或tasks.json(通过扩展,它只是我的命令行)猜测)来编译。我刚刚开始接触 GLFW,并通过扩展使用 GLEW,这样我就可以接触到一些着色器的东西。
我的问题是双重的。我无法静态链接 GLFW 或 GLEW(当我尝试链接库时它会抛出错误),即使我使用 .dll 文件,某些函数也不可用(例如 glGetString(),我没有尝试过更多)那个)。
这是我的tasks.json 文件
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file",
"command": "C:\\msys64\\ucrt64\\bin\\g++.exe",
"args": [
"-g",
"${workspaceFolder}\\src\\**",
"-I",
"C:\\GLFW\\include",
"-I",
"C:\\GLEW\\include",
"-L",
"C:\\GLFW\\lib-static-ucrt",
"-L",
"C:\\GLEW\\lib\\Release\\x64",
"-o",
"${workspaceFolder}\\bin\\GLFWtest.exe",
"-D",
"GLEW_STATIC",
"-lglew32s",
"-lglfw3dll",
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: C:\\msys64\\ucrt64\\bin\\g++.exe"
}
]
}
我选择了glew32s库,因为我想要静态链接,但就像我说的,它抛出了这些错误
Warning: corrupt .drectve at end of def file
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0xd): undefined reference to `__imp_wglGetProcAddress'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0xf): undefined reference to `__imp_wglGetProcAddress'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x29): undefined reference to `__imp_wglGetProcAddress'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x48): undefined reference to `__imp_wglGetProcAddress'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x67): undefined reference to `__imp_wglGetProcAddress'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0xf): more undefined references to `__imp_wglGetProcAddress' follow
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0xe): undefined reference to `__imp_glGetString'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x2de): undefined reference to `__imp_glGetIntegerv'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x2f3): undefined reference to `__imp_glGetIntegerv'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x300): undefined reference to `__imp_wglGetProcAddress'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x363): undefined reference to `__imp_glGetString'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x2d): undefined reference to `__imp_wglGetCurrentDC'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x1c): undefined reference to `__imp_wglGetProcAddress'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x30): undefined reference to `__imp_wglGetProcAddress'
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\GLEW\lib\Release\x64/glew32s.lib(tmp/glew_static/Release/x64/glew.obj):(.text$mn+0x5c): undefined reference to `__imp_wglGetCurrentDC'
collect2.exe: error: ld returned 1 exit status
如果我改为动态链接,我可以让它直接编译,但是当我尝试使用我之前提到的函数时,我收到此错误
C:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\jpwol\AppData\Local\Temp\ccasYrmw.o: in function `main':
C:/Coding Practice/C++/GLFWtest/src/main.cpp:16:(.text+0x101): undefined reference to `glGetString'
collect2.exe: error: ld returned 1 exit status
应该提到的是,我正在运行 64 位编译器,这是我尝试编译的程序的完整代码
#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main(void)
{
glfwInit();
GLFWwindow* window = glfwCreateWindow(1280, 720, "window", NULL, NULL);
glfwMakeContextCurrent(window);
if(glewInit() != GLEW_OK);
{
printf("Error!\n");
}
std::cout << glGetString(GL_VERSION) << '\n';
glfwSetWindowShouldClose(window, false);
fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
return 0;
}
由于某种原因,它会打印“错误!”正如第 14 行所示,无论如何,但 glewGetString(GLEW_VERSION) 无论如何都可以正常工作。
我见过有人说你需要下载 GLEW 的源代码并自己编译它,我尝试过使用其他人发布的参数,但它似乎不适用于我的系统。任何帮助将不胜感激,因为从我没有制作的东西中编译源代码目前可能超出了我的范围。
所有缺失的符号都在
opengl32.lib
中,您没有链接到其中。
将 -lopengl32
添加到编译器命令行。