首页 > 代码库 > Linux下C编程的学习_1

Linux下C编程的学习_1

0x0:为什么写这个系列的文章

博客原本的定位是安卓游戏的破解,但是为什么写这系列的文章呢?

因为在破解过程中,我们是无法避免来写程序的,恢复算法,模拟算法,游戏中对数据的解密,游戏中对保存在客户端金币的字段加解密,游戏中资源文件动态加解密释放,都离不开我们自己来通过分析之后,自己写出来代码。

当然,语言的选择有很多,常用的为c,c++,python,java,lua,这些都是在游戏破解过程中所使用过的,我们精通一门语言的编写是很有必要的,否则,只是单纯地看着别人写的教程,对照着修改游戏,对技术上来说是没有任何进步的,只能让打字,点击鼠标更快而已。

十一这几天,打算静下心来好好复习下c,因为前些日子自己的电脑重装系统为Ubuntu了,所以就找了一点linux下的c语言开发的一些知识。

这里,仅仅是对这几天学习的简单记录,便于以后翻阅,当然,肯定是搜集一些资料来简单整理和实验的,并不能说所有东西都是原创,当然自己也没这本事闭门造车看官方文档就能写出来程序了,这里,感谢所有共享自己学习经验和学习资料的朋友,有分享,大家才能共同进步!

0x1:准备工作


在linux下,内置了很多编译器,如gcc,所以我们不需要来找一些软件配置开发环境了,使用默认的gedit即可,或者使用sublime 2,效果都是不错的,对一些特殊字段进行高亮显示。

0x2:测试代码的编写

Linux 下面,如果要编译一个 C 语言源程序,我们要使用 GNU 的 gcc 编译器。下面
我们以一个实例来说明如何使用 gcc 编译器。

<span style="font-size:18px;">int main(int argc,char **argv)
{
	printf("Hello Linux\n");
}</span>






然后输入   ./hello





gcc 编译器就会为我们生成一个 hello 的可执行文件.执行./hello 就可以看到程序的输出结果了.命令行中 gcc 表示我们是用 gcc 来编译我们的源程序,-o 选项表示我们要求编译器给我们输出的可执行文件名为 hello 而 hello.c 是我们的源程序文件。

gcc 编译器有许多选项,一般来说我们只要知道其中的几个就够了。

 -o 选项我们已经知道了,表示我们要求输出的可执行文件名。 

-c 选项表示我们只要求编译器输出目标代码,而不必要输出可执行文件。 

-g 选项表示我们要求编译器在编译的时候提供我们以后对程序进行调试的信息。

知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你想要知道更多的选项,可以查看 gcc 的帮助文档,那里有着许多对其它选项的详细说明。

0x3:Makefile文件的编写


如果我们有多个c文件需要编译的话,那么我们一般也就不这样一行行代码输入了,肯定要自己写一个shell脚本来编译,但是如果一个工程有很多文件需要编译的花,那么我们优先选择的就是编写一个Makefile文件,然后执行make命令来进行这项负责的操作即可。

例如我们编写一些文件:





那么我们就编写对应的文件:

# 这是上面那个程序的 Makefile 文件

main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c

有了这个 Makefile 文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make 命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理都不想去理的。

下面我们学习 Makefile 是如何编写的。

在 Makefile 中也#开始的行都是注释行.Makefile 中最重要的是描述文件的依赖关系的说
明.一般的格式是:

target: components
TAB rule

第一行表示的是依赖关系.第二行是规则.

比如说我们上面的那个 Makefile 文件的第二行
main:main.o mytool1.o mytool2.o

表示我们的目标(target)main 的依赖对象(components)是 main.o mytool1.o mytool2.o 
当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个 Makefile 第三行所说的一样要执行
 gcc -o main main.o mytool1.o mytool2.o

注意规则一行中的 TAB 表示那里是一个 TAB 键

Makefile 有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:

$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.

如果我们使用上面三个变量,那么我们可以简化我们的 Makefile 文件为:

# 这是简化后的 Makefile

main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $<
mytool1.o:mytool1.c mytool1.h
gcc -c $<
mytool2.o:mytool2.c mytool2.h
gcc -c $<

经过简化后我们的 Makefile 是简单了一点,不过人们有时候还想简单一点.这里我们学习一个 Makefile 的缺省规则

..c.o:

gcc -c $<

这个规则表示所有的 .o 文件都是依赖与相应的.c 文件的.例如 mytool.o 依赖于 mytool.c

这样 Makefile 还可以变为:

# 这是再一次简化后的 Makefile

main:main.o mytool1.o mytool2.o
gcc -o $@ $^
..c.o:
gcc -c $<

好了,我们的 Makefile 也差不多了,如果想知道更多的关于 Makefile 规则可以查看相应的
文档。






Linux下C编程的学习_1