在 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 构建 GLFW3 应用程序 - GLFW LIBRARIES 未设置