GLFW с CMake на Mac

#c #macos #visual-studio-code #cmake #glfw

#c #macos #visual-studio-code #cmake #glfw

Вопрос:

У меня возникли проблемы с использованием GLFW на моем Mac. В настоящее время я использую CMake и visual studio code на macOS Catalina 10.15.7. В настоящее время я использую GLFW 3.4.0.

Но я просто продолжаю получать все эти сообщения об ошибках от GLFW. Похоже, проблема с файлами .m. Я продолжаю получать сообщения об ошибках, подобные этим:

 GLFW/src/nsgl_context.m:81:5: error: expected expression
@autoreleasepool {
^

GLFW/src/cocoa_init.m:80:5: warning: 'UseDictionary' is deprecated: first deprecated in macOS 10.8 [-Wdeprecated-declarations] 
NSDictionary* bundleInfo = [[NSBundle mainBundle] infoDictionary];

GLFW/src/cocoa_monitor.m:228:34: error: use of undeclared identifier 'screen'; did you mean 'strlen'?
monitor->ns.screen = screen;
  

Я добавил GLFW в качестве подмодуля из git, поэтому он должен быть актуальным.

Это всего лишь несколько примеров, но я не знаю, как это исправить.

ПРАВИТЬ ПРАВИТЬ:

Мой CMakeLists.txt файл в настоящее время выглядит следующим образом:

 cmake_minimum_required(VERSION 3.19.0-rc3)

include(FetchContent)

project(Engine)

set(VENDOR_DIR "${CMAKE_CURRENT_SOURCE_DIR}/vendor")
set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
set(HELPERS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src/Helpers")

set(SOURCES
    "${SOURCE_DIR}/Core/os.h"
    "${SOURCE_DIR}/Core/platform.h"
    "${SOURCE_DIR}/Core/core.h"

    "${SOURCE_DIR}/Display/Display.h"
    "${SOURCE_DIR}/Display/Display.cpp"

    "${SOURCE_DIR}/Helpers/IO.h"

    "${SOURCE_DIR}/Platform/OpenGL/OpenGLDisplay.h"
    "${SOURCE_DIR}/Platform/OpenGL/OpenGLDisplay.cpp"
)

# Configure assets header file
configure_file(${HELPERS_DIR}/IO.h.in ${HELPERS_DIR}/IO.h)

add_library(${PROJECT_NAME} ${SOURCES})

# OpenGL
find_package(OpenGL REQUIRED)

# GLFW
FetchContent_Declare(
    GLFW    
    GIT_REPOSITORY "https://github.com/glfw/glfw"
    GIT_TAG "3.3.2"
    GIT_SHALLOW ON
)
FetchContent_MakeAvailable(GLFW)
target_link_libraries(${PROJECT_NAME} GLFW)

# glad
set(GLAD_DIR ${VENDOR_DIR}/glad)
add_library(glad ${GLAD_DIR}/src/glad.c)
target_include_directories(glad PRIVATE ${GLAD_DIR}/include)
target_include_directories(${PROJECT_NAME} PRIVATE ${GLAD_DIR}/include)
target_link_libraries(${PROJECT_NAME} glad ${CMAKE_DL_LIBS})

# glm
FetchContent_Declare(
    glm
    GIT_REPOSITORY "https://github.com/g-truc/glm.git"
    GIT_TAG "0.9.9.8"
    GIT_SHALLOW ON
)
FetchContent_MakeAvailable(glm)
target_link_libraries(${PROJECT_NAME} glm)

target_include_directories(${PROJECT_NAME} PUBLIC ${SOURCE_DIR})

target_precompile_headers(${PROJECT_NAME} PUBLIC "${SOURCE_DIR}/cpch.h")

target_compile_definitions(${PROJECT_NAME} 
    PRIVATE 
    CAFE_GML_ENABLED 
    _CRT_SECURE_NO_WARNINGS 
    GLFW_INCLUDE_NONE

    PUBLIC
    "$<$<CONFIG:DEBUG>:CAFE_DEBUG>"
    "$<$<CONFIG:RELEASE>:CAFE_RELEASE>"
)

target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20)
  

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

1. Вот полное руководство, я уверен, что вы добьетесь успеха, если прочтете его: glfw.org/docs/3.3/build.html

2. Пожалуйста, сообщите нам, с какой точной версией / фиксацией glfw вы работаете. Эта информация имеет значение.

3. Я знаю, вы говорите, что используете gitsubmodules, но это не помогает. Вы хотите сказать, что всегда используете последнюю версию? Подмодуль для конкретной фиксации / ветки?

4. @cpp_guy_who_does_gfx я пытался использовать команды fetchContent CMake для извлечения GLFW 3.3.2, который работает с точки зрения выборки и компоновки, но я по-прежнему получаю много ошибок от GLFW, по-видимому, все они из файлов objective-c (.m), таких как coca_ .m и nsgl_ .m. У меня есть XCodeустановлен в моей системе, которая, насколько я понимаю, должна была установить все необходимые условия для запуска приложений OpenGL на моем mac.

5. Я отредактировал свой ответ с идеями. Но прежде чем что-либо делать, пожалуйста, дважды проверьте и прочитайте документацию glfw перед чем-либо. Я сам знаю в прошлом, что это быстро решает проблемы.

Ответ №1:

Этот код, который вы написали, неверен:

 set(GLFW_DIR ${VENDOR_DIR}/GLFW)
set(GLFW_BUILD_DOCS OFF CACHE BOOL  "GLFW lib only")
set(GLFW_INSTALL OFF CACHE BOOL  "GLFW lib only")
add_subdirectory(${GLFW_DIR})
target_include_directories(Engine PRIVATE ${GLFW_DIR}/include)
target_link_directories(Engine PRIVATE ${GLFW_DIR}/src)
target_link_libraries(glfw)
  

Все, что вам нужно сделать, это следующее:

 add_subdirectory(${GLFW_DIR})
target_link_libraries(glfw)
  

Включаемые каталоги правильно распространяются вверх.

Ваш вопрос даже не говорит нам, какую версию GLFW вы используете. Что вызывает беспокойство.

Вот как я рекомендую вам использовать glfw в современном проекте cmake:

 # This command fetches glfw 3.3.2 from github
# Note the shallow parameter. This means it won't grab all the history.
FetchContent_Declare(glfw
    GIT_REPOSITORY "https://github.com/glfw/glfw"
    GIT_TAG "3.3.2"
    GIT_SHALLOW ON
)

# Now make the glfw target available to link against
FetchContent_MakeAvailable(glfw)

target_link_libraries(foobar PRIVATE glfw)
  

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

Я использую относительно новую версию cmake, поэтому я определенно знаю, что все это работает с cmake 3.15

Также, когда я сказал, что код, который вы написали, был неправильным, я имею в виду, как вы работали с каталогами включения. Переопределение переменных кэша — это нормально.

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

Хм, на данный момент это могут быть реальные ошибки в glfw. Сборка для Apple сложна, поэтому, возможно, это настоящая ошибка glfw.

Вот мои рекомендации.

1.) Используйте последнюю фиксацию glfw и посмотрите, осталась ли у вас проблема

2.) Попробуйте просмотреть проблемы с GLFW https://github.com/glfw/glfw/issues

Это может быть известной проблемой.

3.) Отправьте запрос на выдачу / извлечение, если вы правы, ошибка исходит от GLFW

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

1. я изменил способ включения GLFW, но все равно получаю те же ошибки. Я отредактировал свой вопрос, добавив больше файлов cmakelists