到目前为止,我已经安装了 MinGW、CMake 和 Vulkan SDK。我还根据这个答案下载了GLFW预编译的二进制文件、GLM和PkgConfig 。然后我在 CLion 中创建了一个 CMake 项目。这是 CMakeLists.txt 的内容(我从这里获得):
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})
Run Code Online (Sandbox Code Playgroud)
错误信息如下:
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.
Run Code Online (Sandbox Code Playgroud)
我还尝试按照GLFW 网站上的说明将find_package(glfw3 3.2 REQUIRED)替换为pkg_search_module(GLFW REQUIRED glfw3),但出现错误“未找到所需的 'glfw3'” 和“未找到所需的 'glm'” 。
小智 9
首先是问题,因为这可能是所有访问该线程的人都感兴趣的问题。帖子中演示的问题似乎与其他人可能想要回答的问题非常不同。
访客回答:使用 cmake 时,您需要做三件事才能链接到 Windows 上的 Vulkan 库。
set(ENV{VULKAN_SDK} "Path/To/Vulkan/Version/Installation")
find_package(Vulkan REQUIRED)
target_link_libraries(target ${Vulkan_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
该路径应引用您正在使用的 Vulkan 的特定版本。对我来说,这是C:/VulkanSDK/1.2.198.1,但对你来说会有所不同,具体取决于 Vulkan 的安装位置和你想要使用的版本。
不要忘记添加一个包含目录,target_include_directories(target PUBLIC "C:/VulkanSDK/1.2.198.1/Include")以避免在代码中使用 Vulkan 标头的绝对包含路径。
说明:该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})
Run Code Online (Sandbox Code Playgroud)
正如有人提到的,您需要使用它CMAKE_PREFIX_PATH来指定所在的目录.lib。find_library然后,调用可以在该目录中搜索该条目glfw3.lib,然后再将其指定为链接器输入。即使CMAKE_PREFIX_PATH影响使用时搜索的目录find_package,但包文件不存在,因此错误不会改变。