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

#c #gcc #linker-errors #glfw

#c #gcc #компоновщик -ошибки #glfw

Вопрос:

Я знаю, что эта проблема довольно распространена в SO, но ни один из других ответов, похоже, мне не подходит. Вот документация для GLFW для создания приложений с помощью MinGW, что я и хочу сделать. Я привел здесь минимально воспроизводимый пример:

test.c:

 #include <glfw3.h>

int main() {
    glfwInit();
    glfwTerminate();
    return 0;
}
 

И вот что я хочу сделать:

 gcc -c test.c -Iinclude
gcc test.o -lglfw3 -lgdi32 -o test.exe
 

И вот ошибка, которая дает мне:

 test.o:test.c:(.text 0xc): undefined reference to `glfwInit'
test.o:test.c:(.text 0x11): undefined reference to `glfwTerminate'
collect2.exe: error: ld returned 1 exit status
 

Список вещей, которые я пробовал:

  • Я пробовал как 32-битные, так и 64-битные статические библиотеки glfw3.
  • Я попытался также связать ссылки на другие библиотеки в документации, которую я указал ранее, такие как kernel32 и user32, без изменения ошибки.
  • Я попытался изменить порядок, в котором я связываю библиотеки.

Я немного смущен этой ошибкой, являются ли определения для glfwInit , а glfwTerminate не где-то в libglfw3.a ? Конечно, они есть? Но если да, то почему компоновщик выдает неопределенную ссылочную ошибку?

Комментарии:

1. @user253751 У меня это есть в текущем рабочем каталоге, когда я запускаю команды gcc, я также попытался перепутать имя, чтобы проверить, что gcc нашел правильный файл.

Ответ №1:

проблемы, название которых начинается с неопределенной ссылки, автоматически являются проблемами, связанными с редактированием ссылок (генерацией вашего окончательного двоичного файла из-за редактора ссылок, который происходит в самом конце процесса компиляции)

вы должны убедиться, что каждая требуемая библиотека не только присутствует в вашей системе, но и что ваша инструкция по сборке действительно использует требуемую библиотеку. В Gcc это соответствует параметру -l (обратите внимание, это строчная буква L, а не прописная буква i;))

Комментарии:

1. Разве это не то, что я сделал с gcc test.o -lglfw3 -lgdi32 -o test.exe ?

2. я думаю, что решение состоит в том, чтобы использовать -lglfw, а не -lglfw3

3. Статическая библиотека из glfw называется libglfw3.a

4. Я знаю, что gcc может видеть библиотеку, но он не может видеть определения внутри нее.

5. единственное, что я могу предложить, это проверить это

Ответ №2:

Я обнаружил, что решение этой проблемы заключалось в том, чтобы указать имя файла libglfw3.a непосредственно в аргументах gcc вместо использования аргумента -l, поэтому рабочая вторая команда gcc должна быть:

gcc test.o libglfw3.a -lgdi32