APIENTRY: изменение макроопределения

main.cpp

#ifdef __GNUC__
#include <cmath>
#include <cstring>
#else
#define _USE_MATH_DEFINES
#endif // __GNUC__
#include <iostream>
#include <GL/glu.h>
#include <GLFW/glfw3.h>
#include "Camera.h"
#include "Font.h"

Font.h

#include <Windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <string>
#include <cstdarg>

Font.cpp

#include "Font.h"

Выдаётся предупреждение

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\minwindef.h(130,1): warning C4005: APIENTRY: изменение макроопределения
1>C:\libs\GL\GL\gl.h(78): message : см. предыдущее определение "APIENTRY"

Что это значит?
Если перенести #include <Windows.h> в Font.cpp, то предупреждение пропадает. Если начать менять инклюды местами, предупреждений становится либо больше либо меньше.
А когда проект начнёт разрастаться, вероятно, будет подключена ещё куча библиотек, всё будет друг от друга зависеть и будет миллион таких предупреждений? Как этого избежать?

А include guards в проекте используются?

Пробовал #pragma once - не помогает. Это ведь то же самое, что include guards, только старыми компиляторами не поддерживается?

Насколько понимаю, не 100% одно и то же, есть свои нюансы. Можно добавить guard только в font.h, а не сразу во все заголовочные файлы проекта, чтобы проверить, уйдет ли предупреждение. Хотя теперь начинаю подозревать неподходящие файлы библиотек. Например, в GL.h (из состава Windows SDKs) APIENTRY только используется, но не определяется.

Он не из состава Windows. Я его несколько лет назад откуда-то скачал :man_shrugging:

Намекаете, что у меня GL.h неправильный? :thinking:

Может быть похаканый, вот и возникают предупреждения.

то есть, оригинальный находится в Windows SDK?

Я не подключаю каждый день ОпенГЛ библиотеки к кроссплатформенным проектам, так что всех тонкостей не знаю. В винде заголовочный файл идет в составе Windows SDK, в убунте в пакете mesa-common-dev (c++ - How to get the GL library/headers? - Stack Overflow). Не знаю, одинаковые ли это файлы или нет. Вы можете сравнить скачанный вами где-то файл, с тем, что доступен для вашей ОС, чтобы выявить различия.

Скачал windows SDK. Теперь появились новые ошибки, которых раньше не было.
Если подключить только glfw3.h, то он не видит функцию gluPerspective (в теории, можно и без неё обойтись). А если подключить glu.h, то выдаёт кучу ошибок

Попробуйте вместо подключения glu.h:

#define GLFW_INCLUDE_GLU
#include <GLFW/glfw3.h>

Спасибо. Ещё не пробовал. Но, видимо, проблема в этом.
В библиотеке stb_image тоже надо добавить какую-то длинную хрень, без которой ни одна её функция не видна. А зачем так делают? Почему нельзя сразу все функции определить?

В ридми (GitHub - nothings/stb: stb single-file public domain libraries for C/C++) в принципе все поясняется. Это однофайловая библиотека, благодаря чему имеет свои плюсы, но не имеет разделения на заголовочный файл с объявлениями функций и файл с исходным кодом с определениями функций.