Vico Bill< 刘 利 波 > 的个人网站

记录关于学习、工作中的技术点滴

C,C++,Rust,Ruby爱好者;热衷于游戏开发、任务自动化与跨平台;沉迷于游戏引擎与图形表现;深信'简单、多元'哲学的力量。


访问主页

游戏开发-linux游戏开发环境

linux与包管理

linux是由全世界的geek创建,其设计理念就是为方便编程而生,所以如果想要学编程或为日常编程找个得力平台,Linux当之无愧为其中翘楚。

Linux下的可视化图形环境,是以服务形式提供,称之为X,X之上,存在KDE,Gnome,Xfce等桌面环境。桌面环境可以随意替换,因此无论何种Linux发行版,并不会影响开发。

不同Linux发行版,包含不同的包管理器。包管理器可以快速从网络中,获取所需的软件。安装的软件,通常放在/usr/目录下,包括/usr/bin,/usr/include,/usr/lib 三个目录,统一管理编程环境。这不同于Windows,Windows需要自行管理开发库的下载目录。现在Windows下的开发渐渐改善,存在conan,vcpkg等统一开发包管理工具。

Linux下存在很多既有工具,能有效提高开发效率。Linux的设计哲学是多个小工具一起协作,达到目的。这样的零件式工具有个好处,即如果想要定制其中某一工具,完全是可以的,如果你会编码,甚至可以自行实现。

Linux上,还有一个非常优秀的工具,man,man几乎能获取任何你在开发中所需API的说明文档,甚至内核文档。

gcc

gcc是通用的C/C++编译器,几乎每个Linux发行版都自带gcc。与之对应的,存在clang编译器,是与gcc同等的编译器。 gcc常用命令行参数:

  • c: 仅编译,不链接。
  • o:输出文件
  • @:从文件中读取命令行参数
  • I: 包含文件目录
  • L:依赖库文件目录
  • D:定义宏
  • U:取消定义宏
  • g: 生成调试信息
  • O:优化等级

makefile

makefile是通过target,dependencies,rules定义。

program: file1.c file2.c graphic.a  # 此行定义了目标:program,其依赖file1.c,file2.c,graphic.a三项。当要生成program时,如果其依赖发生变化,则会同时重新编译依赖项。
    # 缩进项定义的是生成规则
    gcc -c file1.c file2.c
    gcc file1.o file2.o graphic.a -lSDL -o program

# 下面定义了目标graphic.a,其依赖项以及生成规则
graphic.a: graphic.c draw.c
    gcc -c graphic.c draw.c 
    ar rcs graphic.a graphic.o draw.o
    ranlib graphic.a

makefile可以定义变量,变量是大小写敏感的,但通常为大写。使用变量时,前缀$并用小括号包裹:$(VAR)。变量主要用途:

  • 存储文件名列表
  • 存储可执行文件名
  • 存储编译器标志 这样可以简化大段代码编写,例如: ``` mk OBJS = foo.o bar.o CC = clang CFLAGS = -Wall -O -g

myprog: $(OBJS) $(CC) $(OBJS) -o myprog

foo.o: foo.c foo.h bar.h $(CC) $(CFLAGS) -c foo.c -o foo.o

bar.o: bar.c bar.h $(CC) $(CFLAGS) -c bar.c -o bar.o

makefile中存在一些内部变量:
- $@: 当前规则的目标文件名
- $< : 依赖项中的第一个依赖文件
- $^ : 整个依赖列表

所以上述makefile可写为:
``` mk
OBJS = foo.o bar.o
CC = clang
CFLAGS = -Wall -O -g

myprog: $(OBJS)
    $(CC) $^ -o $@

foo.o: foo.c foo.h bar.h
    $(CC) $(CFLAGS) -c $< -o $@

bar.o: bar.c bar.h
    $(CC) $(CFLAGS) -c $< -o $@

makefile中的变量,可以通过+= 附加额外项。

makefile还可调用函数,调用规则如:$(函数名 参数)

makefile中存在流程控制:

  • ifneg..else..endif
  • ifeq..else..endif 等。

    gdb:调试器

    gdb可处理以下几个事情:

  • 启动程序,指定可以影响程序行为的命令
  • 程序在特定条件时停下
  • 检查发生了什么
  • 改变程序内容,可试验影响并清理bug。

启动gdb:gdb program [corefile/processid]

常见的gdb命令:

  • break :在指定文件的指定函数上下断点
  • run : 以指定参数执行程序
  • bt: backtrace,显示程序堆栈
  • print: 打印表达式的值
  • c : 继续执行程序
  • next: 执行到程序下一行(step over)
  • edit:查看文件的指定函数行
  • list:列出文件指定函数行
  • step:执行下一程序行(step into)
  • quit: 退出GDB

常见的命令行参数:

  • s: 从指定文件读取符号表
  • e: 使用文件作为可执行文件
  • c: 作为coredump的文件
  • d:添加查找源文件的目录
  • cd:使用指定目录作为GDB的工作目录

跨平台构建工具

CMake/Scons/Rake/Premake/xmake:自动生成makefile

  • CMake目前已经是标准C++项目管理工具,应用于KDE项目中。CMake可以生成不同平台下的工程文件,如:vcxproj,makefile,xcodeproj等等。它并不直接调用编译,编译工作由各个平台下的工具完成。其缺点是需要了解CMake文件格式编写。

  • Scons是Python脚本的构建工具,在脚本层对不同平台进行适配,直接调用编译工具进行编译。Scons不生成平台工程文件,而是直接调用编译工具进行编译。其另外的好处,是如果了解Python,则可迅速入手。

  • WAF:Python语言下的构建工具,与Scons类似。

  • Rake是Ruby语言编写的构建工具,与Scons类似,也是直接调用编译工具进行编译。

  • Premake和XMake都是Lua语言编写的构建工具,与Scons和Rake类似,都是直接调用编译工具进行编译。

Linux平台下生成exe

借助mingw可达到此目的。

  1. sudo pacman -S mingw-w64,
  2. 创建main.c, 进行i686-w64-mingw32-gcc -o main32.exe main.cx86_64-w64-mingw32-gcc -o main64.exe main.c即可生成PE格式的exe文件。以上两个命令分别创建32位和64位exe。
最近的文章

游戏开发-跨平台剪影

跨平台是个非常热门、而且会是长久争论的话题。如今,技术人员所面临的平台选择非常多样,不同的平台会形成不同的技术势力,也称之为不同的技术栈或技术债。跨平台,如今讨论的主要是以下几个平台: PC端一脉:Windows,Linux,Mac OSX Mobile端一脉:Android,IOS,Google Fuchsia, Huawei Harmony等 Console端一脉:Sony PSN, Microsoft XBOX;HTC Vive,Occlus Rift等其他嵌入式如树莓派、Ar...…

继续阅读
更早的文章

【DailyGfx】StencilBuffer 模板缓冲

继续阅读