Изучая C и C++, я начал с SDL2, чтобы визуализировать программы, которые создаю. Я использую код Visual Studio, поскольку мне нравится его внешний вид, и я не хочу использовать 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 и скомпилировать его самостоятельно, и я пробовал использовать аргументы, опубликованные другими людьми, но, похоже, в моей системе это не работает. Любая помощь будет оценена по достоинству, поскольку сбор исходного кода из вещей, которые я не делал, вероятно, сейчас не в моей лиге.
Тот факт, что ваши ошибки компоновщика относятся к функциям с префиксом __imp_, означает, что ваши попытки статической компиляции не увенчались успехом. «imp» — это сокращение от «импорт» и указывает, что компоновщик ищет динамическую библиотеку. Возможно, вам нужно поставить -DGLEW_STATIC раньше в командной строке компиляции (я в этом не уверен, просто предположение).
ОТ: вам следует потратить немного времени на использование реальной системы сборки (популярны make и CMake, но существует множество других). Это позволит вам компилировать ваш код файл за файлом, а не все сразу, и позволит другим компилировать ваш код, не угадывая флаги компиляции.
@Botje Я подумывал об изучении CMake, единственная причина, по которой я еще этого не сделал, это то, что я так привык использовать командную строку и, думаю, почувствовал себя более компетентным, идя по этому пути. хотя мне придется начать это делать





Все недостающие символы находятся в opengl32.lib, на которые вы не указали ссылку.
Добавьте -lopengl32 в командную строку компилятора.
Ха, это помогло, спасибо. Кстати, он все еще печатает «Ошибка!» хотя glewInit() должен возвращать GLEW_OK, знаете ли вы, почему?
Проверьте возвращаемое значение glewInit и/или выполните его с помощью отладчика.
К сожалению, в строке 12 у меня была точка с запятой после условия оператора if. Живи и учись, ха-ха.
Если вы не компилируете библиотеку самостоятельно, крайне важно выбрать библиотеку, подходящую для вашей платформы и параметров компиляции, которые вы используете при компиляции собственного кода.