c++ - 在 Windows 上使用 CMake 设置 Vulkan 项目

标签 c++ cmake vulkan

到目前为止,我已经安装了 MinGW、CMake 和 Vulkan SDK。我还根据 this answer 下载了 GLFW 预编译二进制文件、GLM 和 PkgConfig。 .然后我在 CLion 中创建了一个 CMake 项目。这是 CMakeLists.txt 的内容(我从 here 得到):

cmake_minimum_required(VERSION 3.16)
project(VulkanTest)

set(CMAKE_CXX_STANDARD 17)

add_executable(VulkanTest 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.2 REQUIRED)
include_directories(${GLFW_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${GLFW_LIBRARIES})

错误信息如下:
CMake Error at CMakeLists.txt:15 (find_package):
    By not providing "Findglfw3.cmake" in CMAKE_MODULE_PATH this project has
    asked CMake to find a package configuration file provided by "glfw3", but
    CMake did not find one.

    Could not find a package configuration file provided by "glfw3" (requested
    version 3.2) with any of the following names:

        glfw3Config.cmake
        glfw3-config.cmake

    Add the installation prefix of "glfw3" to CMAKE_PREFIX_PATH or set
    "glfw3_DIR" to a directory containing one of the above files.  If "glfw3"
    provides a separate development package or SDK, be sure it has been
    installed.

我还尝试将 find_package(glfw3 3.2 REQUIRED) 替换为 pkg_search_module(GLFW REQUIRED glfw3),如 GLFW website 所述,但我收到错误“未找到任何必需的‘glfw3’”和“未找到任何必需的‘glm’”。

最佳答案

首先,问题,因为这可能是所有访问此线程的人都感兴趣的问题。帖子中展示的问题似乎与其他人可能想要回答的问题大不相同。
访客回答 :在使用 cmake 时,您需要做三件事才能与 Windows 上的 Vulkan 库链接。

set(ENV{VULKAN_SDK} "Path/To/Vulkan/Version/Installation")
find_package(Vulkan REQUIRED)
target_link_libraries(target ${Vulkan_LIBRARIES})
该路径应引用您正在使用的 Vulkan 的特定版本。对我来说,这是 C:/VulkanSDK/1.2.198.1 ,但根据 Vulkan 的安装位置和您要使用的版本,它会有所不同。
不要忘记添加一个包含类似 target_include_directories(target PUBLIC "C:/VulkanSDK/1.2.198.1/Include") 内容的目录。避免在代码中使用 Vulkan header 的绝对包含路径。
说明 : find_package命令将在您的 cmake 安装中的目录中搜索有关该软件包的详细信息。对我来说,这个目录是 <cmake_install_dir>/share/cmake-3.18/Modules (3.18 应该替换为您安装的版本。)在这个目录中,您将找到一大块名为 Find<PackageName>.cmake 的文件。和 FindVulkan.cmake应该在其中。这个文件是什么find_package正在引擎盖下运行。您会注意到 $ENV{VULKAN_SDK} 的几个实例在那个文件中。这就是为什么VULKAN_SDK调用前必须设置环境变量find_package .如果不是,Cmake 会抛出错误。
lizardsudoku 的问题 (即使您可能已经弄清楚了):如上所述,cmake 期望找到 Findglfw3.cmake那个条目 Modules目录,但没有。与其自己创建这些文件之一,不如像这样直接在 CMakeLists.txt 文件中指定 glfw3 库更容易。
list(APPEND CMAKE_PREFIX_PATH "path/to/lib/directory")
find_library(glfw NAMES glfw3 REQUIRED)
target_link_libraries(target ${glfw})
正如有人提到的,你想利用 CMAKE_PREFIX_PATH指定目录 .lib在。find_library然后调用可以在该目录中搜索 glfw3.lib将其指定为链接器输入之前的条目。即使 CMAKE_PREFIX_PATH影响 find_package 时搜索的目录使用时,包文件不存在,因此错误不会改变。

关于c++ - 在 Windows 上使用 CMake 设置 Vulkan 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60721709/

相关文章:

c++ - 内部编译器错误(CL版本:14.27.29110)

c++ - UE4 - 使用 CameraComponent 时观众不旋转(俯仰)

opencv - 如何为 iOS 构建 opencv_contrib 模块

vulkan - 重叠图像障碍的行为是什么?

c++ - 在另一个之上使用一个渲染 channel

c++ - 只读 std::map?

c++ - 代码值应该每次都更改,因此不会显示相同的座位,但不会显示

Cmake 不使用 add_compile_options 应用编译选项

c++ - 在 CMake 中使用预编译的头文件

vulkan - 如何同步vkCmdCopyBufferToImage()?