Связывание статических GLFW и OpenGL на Mac с CMake - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь проверить glfw3 на Mac.Я не могу построить простой проект, потому что не могу связать с OpenGL.

Структура каталогов

├── CMakeLists.txt
├── OpenGL
│   ├── Application.cpp
│   ├── CMakeLists.txt
│   └── dependencies
│       └── GLFW
│           ├── include
│           │   └── GLFW
│           │       ├── glfw3.h
│           │       └── glfw3native.h
│           ├── lib
│           │   └── libglfw3.a
│           └── src
└── bin

CMakeList.txt

Верхний уровень CMakeList.txt

cmake_minimum_required(VERSION 3.11)

set(CMAKE_CXX_STANDARD 17)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

add_subdirectory(OpenGL)

Вложенный CMakeList.txt

cmake_minimum_required(VERSION 3.11)
project(OpenGL)

find_package(OpenGL REQUIRED)

add_executable(OpenGL Application.cpp)

target_include_directories(OpenGL PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/GLFW/include)
target_link_libraries(OpenGL ${OPENGL_LIBRARIES} ${CMAKE_CURRENT_SOURCE_DIR}/dependencies/GLFW/lib/libglfw3.a)

Applicatin.cpp (взят прямо с glfw.org здесь )

#include <iostream>
#include <GLFW/glfw3.h>

int main()
{
    GLFWwindow* window;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", nullptr, nullptr);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT); <-- this line throws an error

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

Сообщение об ошибке

make[3]: *** No rule to make target '../OpenGL/dependencies/GLFW/include/lib/libglfw3.a', needed by '../bin/OpenGL'.  Stop.
make[3]: *** Waiting for unfinished jobs....
[ 50%] Building CXX object OpenGL/CMakeFiles/OpenGL.dir/Application.cpp.o
/Users/dblock/CLionProjects/OpenGL/OpenGL/Application.cpp:27:17: error: use of undeclared identifier 'GL_COLOR_BUFFER_BIT'
        glClear(GL_COLOR_BUFFER_BIT);
                ^
1 error generated.
make[3]: *** [OpenGL/CMakeFiles/OpenGL.dir/build.make:63: OpenGL/CMakeFiles/OpenGL.dir/Application.cpp.o] Error 1
make[2]: *** [CMakeFiles/Makefile2:86: OpenGL/CMakeFiles/OpenGL.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:98: OpenGL/CMakeFiles/OpenGL.dir/rule] Error 2
make: *** [Makefile:118: OpenGL] Error 2

Моя IDE (CLion) сообщает следующее

Can't resolve variable 'glClear'
Can't resolve variable 'GL_COLOR_BUFFER_BIT'

Пожалуйста, дайте мне знать, где я иду не так.

Редактировать

Я добавил #import, и теперь я получаю новую ошибку

/usr/local/Cellar/cmake/3.11.1/bin/cmake --build /Users/dblock/CLionProjects/OpenGL/cmake-build-debug --target OpenGL -- -j 4
make[3]: *** No rule to make target '../OpenGL/dependencies/GLFW/include/lib/libglfw3.a', needed by '../bin/OpenGL'.  Stop.
make[2]: *** [CMakeFiles/Makefile2:86: OpenGL/CMakeFiles/OpenGL.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:98: OpenGL/CMakeFiles/OpenGL.dir/rule] Error 2
make: *** [Makefile:118: OpenGL] Error 2

Решение

#include <OpenGL/gl.h> //<-- add this included to main.cpp fixed my issue

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

IDE ясно говорит, что не было найдено декларации для glClear и GL_COLOR_BUFFER_BIT

Так как OpenGL является стандартом / спецификацией, производитель драйвера должен реализовать спецификацию для драйвера для конкретной графикиподдержка карт.Поскольку существует множество различных версий драйверов OpenGL, местоположение большинства его функций неизвестно во время компиляции и должно запрашиваться во время выполнения.Задача разработчика - найти расположение функций, в которых он / она нуждается, и сохранить их в указателях функций для последующего использования.

Вам нужен заголовок, в котором объявлены функции OpenGL, и загрузчик, который загружает эти функции.К счастью, для этой цели также есть библиотеки, в которых GLAD является популярной и современной библиотекой.

Создание загрузчика / заголовка GLAD - http://glad.dav1d.de.

Обновление структуры каталогов:

├── CMakeLists.txt
├── OpenGL
│   ├── Application.cpp
│   ├── CMakeLists.txt
│   ├── glad.c
│   └── dependencies
│       ├── GLFW
│       │   └── ...
│       ├── glad
│       │   └── glad.h
│       └── KHR
│           └── khrplatform.h
└── bin

Обновление вложенного CMakeList.txt:

set(SOURCES Application.cpp glad.c)
add_executable(OpenGL ${SOURCES})
target_include_directories(OpenGL PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/dependencies)

Обновление Applicatin.cpp:

#include <glad/glad.h>
#include <GLFW/glfw3.h>
...

glfwMakeContextCurrent(window);

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{ 
  // Failed to create GLFW window
  glfwTerminate();
  return -1;
}
// now you can use OpenGL functions

Дополнительная информация в GLAD github , полная версия пример .Отличное руководство по OpenGL .

0 голосов
/ 07 июня 2018

Я подозреваю, что относительный путь, к которому обращается cmake, неверен (не существует).Я бы посоветовал вам установить glfw3 из HomeBrew следующим образом:

brew install --static glfw3

и указать абсолютный путь glfw3 как "/ usr / local / lib"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...