Проблемы с GLFW и GLEW

Изучая 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 и скомпилировать его самостоятельно, и я пробовал использовать аргументы, опубликованные другими людьми, но, похоже, в моей системе это не работает. Любая помощь будет оценена по достоинству, поскольку сбор исходного кода из вещей, которые я не делал, вероятно, сейчас не в моей лиге.

Если вы не компилируете библиотеку самостоятельно, крайне важно выбрать библиотеку, подходящую для вашей платформы и параметров компиляции, которые вы используете при компиляции собственного кода.

john 18.05.2024 14:24

Тот факт, что ваши ошибки компоновщика относятся к функциям с префиксом __imp_, означает, что ваши попытки статической компиляции не увенчались успехом. «imp» — это сокращение от «импорт» и указывает, что компоновщик ищет динамическую библиотеку. Возможно, вам нужно поставить -DGLEW_STATIC раньше в командной строке компиляции (я в этом не уверен, просто предположение).

john 18.05.2024 14:28

ОТ: вам следует потратить немного времени на использование реальной системы сборки (популярны make и CMake, но существует множество других). Это позволит вам компилировать ваш код файл за файлом, а не все сразу, и позволит другим компилировать ваш код, не угадывая флаги компиляции.

Botje 18.05.2024 15:28

@Botje Я подумывал об изучении CMake, единственная причина, по которой я еще этого не сделал, это то, что я так привык использовать командную строку и, думаю, почувствовал себя более компетентным, идя по этому пути. хотя мне придется начать это делать

jpwol 18.05.2024 15:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все недостающие символы находятся в opengl32.lib, на которые вы не указали ссылку. Добавьте -lopengl32 в командную строку компилятора.

Ха, это помогло, спасибо. Кстати, он все еще печатает «Ошибка!» хотя glewInit() должен возвращать GLEW_OK, знаете ли вы, почему?

jpwol 18.05.2024 15:55

Проверьте возвращаемое значение glewInit и/или выполните его с помощью отладчика.

Botje 18.05.2024 17:28

К сожалению, в строке 12 у меня была точка с запятой после условия оператора if. Живи и учись, ха-ха.

jpwol 18.05.2024 21:24

Другие вопросы по теме