Неопределенные ссылочные ошибки при связывании GLFW на MinGW

Я пытаюсь разработать приложение openGL с GLEW и GLFW для Windows, используя minGW. В текущем каталоге project/У меня есть каталоги src/, bin/, а также glfw-3.0.4.bin.WIN64/, У меня есть файлы test.cpp, glew.h, glew.c, а также wglew.h в src/ каталог.

Каталог ./glfw-3.0.4.bin.WIN64/include/ содержит GLFW/glfw3.h заголовочный файл

Каталог ./glfw-3.0.4.bin.WIN64/lib-mingw/ содержит glfw3.dll, glfw3dll.a, а также libglfw3.a,

Мой основной файл, test.cpp содержит,

#include "glew.h"
#include "GLFW/glfw3.h"

#include <stdio.h>

int main(int argc, char** argv) {
    printf("Hello, World!\n");

    glewInit();
    glfwInit();
}

Я собираю программу из project/ каталог с помощью (разделить на две строки для удобства чтения)

gcc -DGLEW_STATIC -DGLFW_DLL -o ./bin/test ./src/*.cpp ./src/glew.c 
-I ./glfw-3.0.4.bin.WIN64/include/ -L ./glfw-3.0.4.bin.WIN64/lib-mingw/ -lglfw3 -lopengl32

и я получаю следующую ошибку:

undefined reference to `_imp_glfwInit'

Я думаю, что проблема связана со мной, неправильно связывающим библиотеку GLFW. Из того, что я понимаю, в том числе вариант компилятора -lglfw3 скажет gcc ссылку ./glfw-3.0.4.bin.WIN64/lib-mingw/glfw3.dll, который содержит определение для glfwInit(),

Я посмотрел на решения других проблем, похожих на мою, и они предлагают такие вещи, как копирование файла dll в каталоги source/binary и изменение порядка параметров -l, но ни одна из них, похоже, не решила проблему для меня.

1 ответ

Решение

Ваша проблема в том, что gcc следует строгим правилам именования библиотек. Пытается найти glfw3.dll.a, но не находит ничего (потому что он назван glfw3dll.a - простое переименование решит вашу проблему).

Следующий шаг это ищет libglfw3.a, и успешно - но это статическая библиотека, в то время как ссылка объявлена ​​как динамическая в заголовочных файлах (хитрые окна DECLSPEC... эта проблема не существует, например, в Linux). Таким образом, он не может найти _imp__glfwInit, потому что в статической библиотеке это называется просто glfwInit, так что вы получаете ошибку.

Удаление libglfw3.a также один из вариантов - в этом случае gcc будет смотреть дальше и в конечном итоге найти glfw3.dll и использовать это.

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