VS Code+MinGW 配置Vulkan开发环境(Windows)
初学Vulkan,网上教程不多,而且大多是用Visual Studio开发的,VS太大了不想再去下载…所以准备在VS Code上搭建环境。搭建时因为找不到相关文章,遇到了挺多麻烦…好在都解决了…所以自己来写一篇帮下像我一样的新手。(环境虽然配置好了,但没有进行充分的测试,如有错误请多指正)
本机环境:win10,GTX 960m
(一)软件下载
相关软件下载,我一上来就栽了…
参考:https://vulkan-tutorial.com/Development_environment#page_Setting_up_Visual_Studio
国内有翻译版:https://www.cnblogs.com/heitao/p/6882815.html
1. VS Code
在[- VS Code 官网 -](https://code.visualstudio.com/)下载即可,然后配置C++开发环境,这个网上有许多教程,比如:
https://blog.youkuaiyun.com/bat67/article/details/76095813
下载安装MinGW时注意是32位还是64位!!!不带编号的(如:MinGW)应该是32位,像MinGW-w64是64位!!记住自己安装的是哪一个!!!
配置好后先写个Hello world测试一下。
2. Vulkan SDK
要使用Vulkan需要显卡支持,可以下载SDK后运行SDK里bin或bin32目录下的vkcube.exe,如果能运行说明显卡支持Vulkan;Nvidia显卡也可以在这个网站看是否支持: https://developer.nvidia.com/vulkan-driver
Vulkan官方地址:https://vulkan.lunarg.com/home/welcome
下载即可,一个安装包里32位和64位都有。
3. GLFW
一个窗口库,他们在都用那我也用呗orz
GLFW下载地址: https://www.glfw.org/download.html
注意选择和之前MinGW一致的版本!!!
我之前没注意下载的32位MinGW+64位GLFW,出了问题DEBUG一下午…
4. GLM
Vulkan没有线性代数计算的库,由此引入GLM。
GLM下载地址: https://github.com/g-truc/glm
Github项目,点右边的Clone or download然后点Download ZIP即可。
(二)软件配置
软件配置花了我最久…这都源于对软件和编译器的不了解=-=搞懂这个学到了好多东西
接下来我们要做的,是要将各软件的头文件和库导入项目
1. 头文件的导入
我们知道,C/C++引入头文件有两种方式#include <xxx>和#include “xxx”,尖括号版的include的直接从“默认目录”搜索,引号版的先从项目目录搜索,再到默认目录搜索。
因为GLFW里头文件对Vulkan头文件的引用是尖括号,网上许多实例代码也都用的尖括号,所以就统一用尖括号,因此我们要将头文件放到“默认目录”,而这个“默认目录”一般包含有MinGW安装目录下的include文件夹。
(也可以在VS Code里配置编译器参数,使用-I参数(大写i)来指定搜索目录…这里不做赘述)
接下来就要把各个软件的头文件放到这里面来了。
- Vulkan SDK
找到SDK安装目录,依次打开 “1.1.101.0”(版本号) 、“Include” 文件夹,将里面的vulkan文件夹复制到上面的目录。
- GLFW
找到GLFW安装目录,打开"include" 文件夹,将里面的GLFW文件夹复制到上面的目录。
我这里是glfw-3.2.1.bin.WIN32,64位版的就是glfw-3.2.1.bin.WIN64。 - GLM
找到GLFW安装目录,打开"include" 文件夹,将里面的glm文件夹复制到上面的目录。
现在,所有头文件就放好了。
2. 库的导入
除了头文件,我们还需要 库(library) 才能编译运行程序,否则可能会出现类似的错误:
xxx/xxx.cpp:19: undefined reference to 'vkEnumerateInstanceExtensionProperties@12' //未加载vulkan-1库
xxx/xxxx.cpp:13: undefined reference to 'glfwInit' //未加载glfw3dll库
xxx/mingw32/bin/ld.exe: xxx/xxx.cpp:15: undefined reference to 'glfwWindowHint'
xxx/mingw32/bin/ld.exe: xxx/xxx.cpp:16: undefined reference to 'glfwCreateWindow'
xxx/mingw32/bin/ld.exe: xxx/xxx.cpp:27: undefined reference to 'glfwWindowShouldClose'
xxx/mingw32/bin/ld.exe: xxx/xxx.cpp:28: undefined reference to 'glfwPollEvents'
xxx/mingw32/bin/ld.exe: xxx/xxx.cpp:31: undefined reference to 'glfwDestroyWindow'
xxx/mingw32/bin/ld.exe: xxx/xxx.cpp:33: undefined reference to 'glfwTerminate'
库文件也有“默认目录”的说法,一般为MinGW安装目录下的 lib 文件夹。库文件有许多种,如.dll、.so、.a、.lib,具体关系可以看这篇文章: https://www.cnblogs.com/ziyunlong/p/6023121.html
MinGW以前好像只支持.a的库,但现在支持.lib格式的库了,vulkan给的库好像都是.lib后缀,多亏了这个更新才能使用vulkan…
这里只有Vulkan和GLFW需要用库。
- Vulkan SDK
找到SDK安装目录,依次打开 “1.1.101.0”(版本号) 、“Lib32” 文件夹(如果你是64位,就是Lib文件夹),将里面的vulkan-1.lib复制到MinGW安装目录下的lib文件夹。 - GLFW
找到GLFW安装目录,打开lib-mingw文件夹如果你是64位,就是lib-mingw-w64文件夹),将里面的libglfw3dll.a复制到MinGW安装目录下的lib文件夹。
(注:这里我用的是libglfw3dll.a,运行程序时需要把同目录下的glfw3.dll复制到程序所在文件夹,不知道为什么使用libglfw3.a会报错…) - VS Code配置
库文件光复制了还没用,需要在VS Code里配置!!!!
打开之前配置VS Code的C++调试环境时创建的tasks.json文件,找到args,在数组里添加 “-lglfw3” 和 “-lvulkan-1”(注意格式)
现在所有工作就完成了!
(三)测试
以下代码来自Vulkan Tutorial。复制到VS Code里测试。
// https://vulkan-tutorial.com/Development_environment
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>
#include <iostream>
int main() {
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
uint32_t extensionCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
std::cout << extensionCount << " extensions supported" << std::endl;
glm::mat4 matrix;
glm::vec4 vec;
auto test = matrix * vec;
while(!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
效果: