日前在学习制作LearnOpenGL教程的实战项目Breakout游戏时,希望能将这个小游戏开发成跨平台的,支持在多个平台运行。工欲善其事必先利其器,首先需要做的自然是搭建一个舒服的跨平台C/C++开发环境,所以这篇文章主要就是记录环境搭建的整个过程,踩到的一些坑,以及对应的解决办法。
正文开始之前,先来阐述几个问题
为什么选择使用VSCode
实在用不习惯Visual Studio(也可能是用的太少了T▽T)
代码编辑方面更喜欢用轻量级的编辑器,比如Sublime或者VSCode
VSCode确实比较强大好用,插件丰富
为什么使用CMake
通用的编译构建工具,跨平台的关键,一份代码,CMake可以针对不同的系统编译构建生成不同的项目工程
源代码管理,编译更加方便(如果仅仅使用VSCode搭建开发环境,则每添加一个源文件,就要改动一下编译指令)
最终实现的开发流程是怎样的
VSCode编写代码
快捷键Ctrl+Shift+B,调用CMake完成本地项目生成(Mac快捷键Command+Shift+B)
快捷键Ctrl+B,完成项目的编译构建与运行(Mac快捷键Command+B)
快捷键F5,完成项目的调试与运行(VSCode的F5调试运行,为了能够实现调试功能额外做了许多工作,所以启动会有些慢,因此在不需要调试的时候,直接使用Ctrl+B编译运行看效果会更快些)
开发工具
CMake与VSCode
CMake的获取,可以查看CMake官网
VSCode的获取,可以查看VSCode官网
关于CMake与VSCode如何安装,比较简单,网上也有很多教程,这里就不详细介绍了
VSCode插件推荐安装
在VSCode的Extensions面板中搜索下面的插件名即可,记得看清作者名,不要下错啦
插件名
作者
描述
C/C++
Microsoft
提供C/C++的代码提示,跳转,调试等诸多功能,官方出品,基本是C/C++开发必备了
CMake
twxs
提供CMake语法的高亮显示以及代码段提示
示例项目
这里给出例子工程的文件目录情况,并不完整,但具有一定的代表性,不仅涉及源代码的编译,同样包含了静态库,动态库的加载,以及资源文件的读取等问题
Breakout
├── 3rd // 第三方库
│ ├── glfw // 一个静态库目录
│ ├── irrKlang-1.6.0 // 一个动态库目录
│ └── FindIrrKlang.cmake // cmake文件
├── resources // 资源目录
│ ├── textures // 存放贴图文件
│ └── shaders // 存放shader文件
├── src // 源代码目录
│ ├── game // 源代码子目录
│ │ ├── game.h
│ │ └── game.cc
│ └── main.cc
└── CMakeLists.txt // cmake文件
使用CMake
本文仅着重介绍为了完成示例项目开发,解决特定问题而使用的一些cmake语句,详细的cmake介绍可以查看这份还不错的文档或者这篇博文
cmake的所有语句都写在CMakeLists.txt中,cmake会根据该文件中的配置完成最终的编译,构建,打包,测试等一系列任务
一个简单的CMakeLists.txt如下所示,完整的文件可以查看这里
# cmake最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 设置PROJECT_NAME变量
set(PROJECT_NAME Breakout)
# 设置工程名
project (${PROJECT_NAME})
# 查找当前目录下的所有源文件并存入DIR_SRCS变量
aux_source_directory(src DIR_SRCS)
# 添加一个可编译的目标到工程
add_executable (${PROJECT_NAME} ${DIR_SRCS})
如何编译一个文件夹下的所有源代码
在开发过程中,由于架构设计或是为了便于管理与查找,源文件一般会根据不同的功能存放在不同的文件夹中,文件夹中又可能嵌入文件夹,所以需要一条语句能够获取所有的源文件进行编译,而不用每新创建一个源文件,就修改一次编译指令
# 递归列出所有源文件
file (GLOB_RECURSE SOURCE_FILES *.cc)
# 添加一个可编译的目标到工程
add_executable (${PROJECT_NAME} ${SOURCE_FILES})
上面这条file命令会递归列出所有.cc文件,并存入SOURCE_FILES变量,然后将SOURCE_FILES表示的所有.cc文件添加到目标即可,从而解决多源文件编译问题
如何引入一个第三方静态库
为了不重复造轮子,开发中不可避免的要引入其他第三方库。正常情况下,这个第三方库也会是一个CMake工程(或是库的开发者直