在 Mac 上使用 CMake 的 GLFW

Posted

技术标签:

【中文标题】在 Mac 上使用 CMake 的 GLFW【英文标题】:GLFW with CMake on Mac 【发布时间】:2020-11-11 15:28:23 【问题描述】:

我在我的 Mac 上使用 GLFW 时遇到问题。 我目前在 MacOS Catalina 10.15.7 上使用 CMake 和 Visual Studio 代码。我目前正在使用 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)

【问题讨论】:

这里是完整的手册,如果您阅读它,我相信您会成功:glfw.org/docs/3.3/build.html 请告诉我们您正在构建的 glfw 的确切版本/提交。这些信息很重要。 我知道你说你正在使用 gitsubmodules 但这没有帮助。你是说你一直在使用最新的吗?特定提交/分支的子模块? @cpp_guy_who_does_gfx 我尝试使用 FetchContent CMake 命令来获取 GLFW 3.3.2,它在获取和链接方面起作用,但我仍然从 GLFW 中得到很多错误,似乎所有错误都来自Objective-c (.m) 文件,例如 coca_.m 和 nsgl_.m。我的系统上安装了 XCode,就我而言,它应该已经安装了在我的 mac 上运行 OpenGL 应用程序的所有先决条件。 我已经用想法编辑了我的答案。但在任何事情之前,请仔细检查并阅读 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。这是令人担忧的。

以下是我对如何在现代 cmake 项目中使用 glfw 的建议:

# 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 中的实际错误。为苹果构建是棘手的,所以这可能是 glfw 的真正错误。

这是我的建议。

1.) 使用 glfw 的最新提交,看看是否还有问题

2.) 尝试浏览 GLFW 问题 https://github.com/glfw/glfw/issues

这可能是一个已知问题。

3.) 如果错误来自 GLFW,请提交问题/拉取请求

【讨论】:

我改变了包含 GLFW 的方式,但我仍然遇到相同的错误。我已经用包含的更多 cmakelists 文件编辑了我的问题

以上是关于在 Mac 上使用 CMake 的 GLFW的主要内容,如果未能解决你的问题,请参考以下文章

如何使用cmake在mac上链接OpenGL相关库?

Mac 上的 GLFW 环境配置

使用 CMAKE 构建 GLFW3 应用程序 - GLFW LIBRARIES 未设置

Haskell openGL 和 GLUT 在 Mac OS X 上冻结?我可以在 GLUT 上使用 GLFW 吗?

VS2017 配置glfw3

openGL 学习之路一 在mac电脑上搭建opengl环境