#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