Неопределенные справочные ошибки при связывании 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 в исходные/двоичные каталоги и изменение порядка параметров -l, но ни один из них, похоже, не решил проблему для меня.


person recreate    schedule 25.03.2014    source источник
comment
Ваша команда gcc разделена на две строки. Это ради удобочитаемости здесь? Или это ваша настоящая команда (в таком случае она неверна)? Также, насколько я помню, -Ipath и -Lpath надо писать без пробела.   -  person keltar    schedule 25.03.2014
comment
Да, извините, я должен был отметить, что команда gcc была разделена для удобства чтения. Выполнение команды без пробелов по-прежнему приводит к той же ошибке.   -  person recreate    schedule 25.03.2014
comment
Не могу сказать точно, но я предполагаю, что что-то не так с вашими библиотеками. Вы уверены, что они совместимы с mingw и должны быть 64-битными? Можете ли вы запустить его с 32-битной версией?   -  person keltar    schedule 25.03.2014
comment
О, я действительно думал, что это решит проблему. Я использую mingw для 32-битных систем. Я переключился на использование glfw-3.0.4.bin.WIN32, но все равно получаю ту же ошибку времени компиляции.   -  person recreate    schedule 25.03.2014
comment
Не могли бы вы собрать минимальный пример (со всеми необходимыми исходниками и библиотеками) и выложить куда-нибудь? Трудно диагностировать такие проблемы, не видя их.   -  person keltar    schedule 25.03.2014
comment
Конечно. drive.google.com/file/d/0BzaMTyFoNpy3RHlCalRpM054bVE/ Это немного отличается от того, что у меня выше.   -  person recreate    schedule 25.03.2014


Ответы (1)


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

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

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

person keltar    schedule 25.03.2014