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可达到此目的。
sudo pacman -S mingw-w64
,- 创建main.c, 进行
i686-w64-mingw32-gcc -o main32.exe main.c
或x86_64-w64-mingw32-gcc -o main64.exe main.c
即可生成PE格式的exe文件。以上两个命令分别创建32位和64位exe。