【问题标题】:GLFW + Vulkan on OSXOSX 上的 GLFW + Vulkan
【发布时间】:2018-02-14 00:29:49
【问题描述】:

我正在为我的一个项目设置 GLFW 和 Vulkan。对于 Vulkan,我使用 MoltenVk 来获取 Vulkan compat 和 GLFW 来创建窗口。我使用的IDE是CLion,使用的是CMake系统。

从一些 github 问题来看,似乎支持这种设置,但没有人提到它是如何完成的。

GLFW 是通过 homebrew 和 MoltenVK 手动安装的,方法是将 MoltenVK 和 vulkan 文件夹添加到 usr/local/include 并将 MacOS 文件夹的内容添加到 usr/local/lib (尽管我很确定 MoltenVK.framework 不应该是那里)。

此时,Clion 可以看到 GLFW 和 Vulkan 标头,但我仍然需要将它们正确链接起来。

完整的 CMakeLists.txt 文件现在如下:

cmake_minimum_required(VERSION 3.8)
project(VulkanEngine)

#set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} “${CMAKE_SOURCE_DIR}/cmake/Modules”)

set(CMAKE_CXX_STANDARD 17)

set(SOURCE_FILES src/main.cpp)
add_executable(VulkanEngine ${SOURCE_FILES})

#Finding and linking GLFW3

find_package(glfw3 3.2 REQUIRED)
if (glfw3_FOUND)
    include_directories(${glfw3_INCLUDE_DIRS})
    target_link_libraries (VulkanEngine ${glfw3_LIBRARIES})
endif (glfw3_FOUND)

#Finding and linking Vulkan

find_package (Vulkan)
if (Vulkan_FOUND)
    include_directories(${Vulkan_INCLUDE_DIRS})
    target_link_libraries (VulkanEngine ${Vulkan_LIBRARIES})
endif (Vulkan_FOUND)

当 cmake 项目重新加载时,控制台会告诉以下信息:

-- Could NOT find Vulkan (missing:  Vulkan_LIBRARY) 
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/mtesseract/dev/cpp/VulkanEngine/cmake-build-debug

对我来说,这表明 GLFW 已找到并链接,但是当我尝试为 GLFW 构建“hello world”时,我收到以下消息:

Undefined symbols for architecture x86_64:
  "_glfwInit", referenced from:
      _main in main.cpp.o

我从 GLFW github 页面 https://git.io/v5ggN 获得了 FindVulkan.cmake,因为它支持 MoltenVK,但我不确定 CMake 是否完全支持它。 (我把文件放在(projectroot)/cmake/modules/)

在这一点上,我不知道为什么事情没有正确链接,因此感谢您的帮助。

【问题讨论】:

  • 要找到您的 FindVulkan.cmake,您需要设置 CMAKE_MODULE_PATH 以包含 cmake/modules/ 。您的 CMakeList.txt 中有该行,但它已被注释掉,因此您必须取消注释。
  • 另外,你确定find_package(glfw3) 设置了glfw3_FOUND 变量而不是GLFW3_FOUND 一个吗?这取决于您拥有的查找脚本,并且此类脚本通常会记录它们设置的变量。
  • @Tsyvarev 我没有在任何地方明确指定脚本,并且根据您所说的更改,我确实让脚本通过 GLFW3_FOUND 语句(使用 MESSAGE 命令测试)。奇怪的是,它仍然说 _glfwInit 是一个未定义的符号。
  • @Eelke 我禁用了它,但没有找到 Vulkan,因为如果我将 REQUIRED 参数添加到 find_package(Vulkan) 它会出错。你知道我应该如何为 MoltenVK 准备库以正确获取吗?
  • 由于脚本设置GLFW3_FOUND 变量,它可能设置GLFW3_LIBRARIES 等等(前缀为大写)。所以你也需要更新你的其他命令。

标签: c++ macos cmake glfw vulkan


【解决方案1】:

我找到了一个至少在某种程度上似乎可行的解决方案。在这一点上,我还有另一个问题需要处理(GLFW 似乎没有注意到 MoltenVK 的存在)。

到目前为止的过程如下(可以在我的github页面(github.com/mtesseracttech/VulkanEngine)上找到:

Vulkan + GLFW + GLM Setup Process with CMake and Package Managers

Windows:

Preparation:
Create CLion Application Project 
Install MSYS2 (Cygwin-like package manager that includes a windows port of Arch's PacMan)
Install LunarG VK SDK
Download FindVulkan.cmake from GFLW's Github (it includes a path for MoltenVK(for OSX Later)) and put it in (proj_root/cmake/modules)

MSYS2 Commands:

$ pacman -Su //Updates pacman
$ pacman -Ss {packageName} //Is used for searching for exact package names

Installed Packages through msys2:

$ pacman -S mingw-w64-x86_64-toolchain //Installs the CLion toolchain that includes CMake, Make, GCC, etc.
$ pacman -S mingw-w64-x86_64-glfw //Installs GLFW
$ pacman -S mingw-w64-x86_64-glm //Installs GLM
$ pacman -S mingw-w64-x86_64-vulkan //Vulkan can also be installed through this method, but I went with LunarG

Enter the following in the CMakeLists.txt file in the root of the project:

######################################################################################

cmake_minimum_required(VERSION 3.8)
project(VulkanEngine)

set(CMAKE_CXX_STANDARD 17)

set(SOURCE_FILES src/main.cpp)
add_executable(VulkanEngine ${SOURCE_FILES})

#Setting up PkgConfig

find_package(PkgConfig REQUIRED)

#Finding and linking GLFW3

pkg_search_module(GLFW3 3.2 REQUIRED glfw3)
if(GLFW3_FOUND)
    message(STATUS "Found GLFW, Including and Linking now")
    include_directories(${GLFW3_INCLUDE_DIRS})
    target_link_libraries(VulkanEngine ${GLFW3_STATIC_LIBRARIES})
endif(GLFW3_FOUND)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")

#Finding and linking Vulkan

find_package (Vulkan)
if (VULKAN_FOUND)
    message(STATUS "Found Vulkan, Including and Linking now")
    include_directories(${VULKAN_INCLUDE_DIR})
    target_link_libraries (VulkanEngine ${VULKAN_LIBRARY})
endif (VULKAN_FOUND)

######################################################################################




OSX:

Preparation

Create CLion Application Project 
Install HomeBrew (package manager)
Download MoltenVK
Download FindVulkan.cmake from GFLW's Github (it includes a path for MoltenVK(for OSX Later)) and put it in (proj_root/cmake/modules)

Homebrew:
brew update //Updates homebrew
brew install glfw //Installs GLFW
brew install glm //Installs GLM

MoltenVK:
Place MoltenVK/macOS's contents into /usr/local/lib
Place MoltenVK/macOS/MoltenVK.framework/headers's contents into /usr/local/inc/MoltenVK

CMake: 
Same as on windows, but in the FindVulkan.cmake file, add at the very end of the elseif(APPLE) block the line:
set(VULKAN_INCLUDE_DIR "/usr/local/include/MoltenVK")
This is not a pretty or flexible solution, but for now it will do.

我很确定这个解决方案并不理想,因为 GLFW 没有采用 MoltenVK 的这种策略,但至少可以编译,所以我认为这是一个进步。

【讨论】:

  • 这不是您的问题的好答案,您不需要 msys2 来使其工作。您最初的错误消息是缺少 _glfwInit 的定义,这与 Vulkan 的关系不大,而与 GLFW 的关系更大。
  • 你能用MESSAGE 验证glfw3_LIBRARIES 是一个非空字符串吗?另外,main.cpp 究竟是如何包含 GLFW 标头的?通过#include <GLFW/glfw3.h>?
【解决方案2】:

您的问题似乎是您尚未定义 VULKAN_SDK 变量。确保将其指向 SDK 内 /lib 和 /include 的父文件夹,FindVulkan 应该可以工作

VULKAN_SDK=/opt/vulkan/x86_64 cmake.

【讨论】:

    猜你喜欢
    • 2013-10-25
    • 2012-07-19
    • 2014-06-20
    • 2018-08-05
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多