Неопределенные ссылочные ошибки при связывании 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
и использовать это.