Vulkan macOS 实例加载失败

问题描述 投票:0回答:2

我正在按照 vulkan 教程在 macOS 上创建实例。我的观点略有不同,因为我使用的是 Clion,因此使用的是 CMake,而不是 XCode。当我尝试运行该程序时,无法创建 Vulkan 实例,并且进程因错误而退出。

我已经检查过,我的 GLFW 库支持 Vulkan(3.3,使用自制软件

--HEAD
标志安装)。

我的代码:

#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>

#include <iostream>
#include <stdexcept>
#include <cstdlib>

const int WIDTH = 800;
const int HEIGHT = 600;

class HelloTriangleApplication {
public:
    void run() {
        initWindow();
        initVulkan();
        mainLoop();
        cleanup();
    }

private:
    GLFWwindow* window;
    VkInstance instance;

    void initWindow() {
        glfwInit();

        glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
        glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);

        window = glfwCreateWindow(WIDTH, HEIGHT, "Vulkan", nullptr, nullptr);
    }

    void initVulkan() {
        if(glfwVulkanSupported()) {
            std::cout << "Vulkan supported";
            createInstance();
        }
    }

    void mainLoop() {
        while (!glfwWindowShouldClose(window)) {
            glfwPollEvents();
        }
    }

    void cleanup() {
        vkDestroyInstance(instance, nullptr);

        glfwDestroyWindow(window);

        glfwTerminate();
    }

    void createInstance() {
        VkApplicationInfo appInfo = {};
        appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
        appInfo.pApplicationName = "Hello Triangle";
        appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
        appInfo.pEngineName = "No Engine";
        appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
        appInfo.apiVersion = VK_API_VERSION_1_0;

        VkInstanceCreateInfo createInfo = {};
        createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
        createInfo.pApplicationInfo = &appInfo;

        uint32_t glfwExtensionCount = 0;
        const char** glfwExtensions;
        glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);

        createInfo.enabledExtensionCount = glfwExtensionCount;
        createInfo.ppEnabledExtensionNames = glfwExtensions;

        createInfo.enabledLayerCount = 0;

        if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) {
            throw std::runtime_error("failed to create instance!");
        }
    }
};

int main() {
    HelloTriangleApplication app;

    try {
        app.run();
    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

我的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.14)
project(vulkantutorial)

set(CMAKE_CXX_STANDARD 17)

add_executable(vulkantutorial main.cpp)

find_package(Vulkan REQUIRED)
target_include_directories(${PROJECT_NAME} PUBLIC ${Vulkan_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} Vulkan::Vulkan)

find_package(PkgConfig REQUIRED)
pkg_search_module(GLM REQUIRED glm)
include_directories(${GLM_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${GLM_LIBRARY_DIRS})

find_package(glfw3 3.3 REQUIRED)
include_directories(${GLFW_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${GLFW_LIBRARIES})

在我的 CLion 设置中,我定义了以下环境变量:

  • DYLD_LIBRARY_PATH
  • VK_LAYER_PATH
  • VK_ICD_FILENAMES
  • VULKAN_SDK

除了

VULKAN_SDK
之外的所有人都需要获得
vulkaninfo

==========
VULKANINFO
==========

Vulkan Instance Version: 1.1.114



Instance Extensions:
====================
Instance Extensions     count = 8
        VK_EXT_debug_report                 : extension revision  9
        VK_EXT_debug_utils                  : extension revision  1
        VK_EXT_swapchain_colorspace         : extension revision  4
        VK_KHR_device_group_creation        : extension revision  1
        VK_KHR_get_physical_device_properties2: extension revision  1
        VK_KHR_get_surface_capabilities2    : extension revision  1
        VK_KHR_surface                      : extension revision 25
        VK_MVK_macos_surface                : extension revision  2
Layers: count = 0
=======
Presentable Surfaces:
=====================
GPU id       : 0 (Intel(R) Iris(TM) Plus Graphics 655)
Surface type : VK_MVK_macos_surface
Formats:                count = 32
        B8G8R8A8_UNORM
...

任何人都可以提供一些启发和帮助吗?

macos glfw vulkan moltenvk
2个回答
0
投票

看来虽然我在CLion

Preferences -> Build, Execution, Deployment -> CMake -> Environment
中设置了环境变量,但这些并没有传递到运行配置中。

这很有趣,因为它们似乎已部分注册 - 我在

DYLD_LIBRARY_PATH
中输入错误,并因我的麻烦而得到了
dyld: warning, unknown environment variable: DYLD_LIBRARY

在运行配置中显式设置环境变量解决了问题(并且还突出显示了我的图层路径中的错误)。不过,我认为这些应该通过 CMake 传递下去是否正确?


0
投票

启用 SIP(系统完整性保护)后,无法从 shell 脚本设置 DYLD_LIBRARY_PATH。我猜 Vulkan 团队在禁用 SIP 的情况下运行,因为我在任何地方都找不到对此问题的参考。

类似: env DYLD_LIBRARY_PATH =“$ MY_DYLD_LIBRARY_PATH”executable_goes_here

© www.soinside.com 2019 - 2024. All rights reserved.