熟悉啦linux下打基础操作:
先说一下makefile 吧
利用vim写啦一个最简单的makefile
test:l3lseek.o
gcc l3lseek.o -o test
clean:
rm -rf test
rm-rf *.o
从这里可以学习到两方面打知识:
1 makefile打基本写法
目标:依赖条件
执行命令
这是最简单打makefile
2 就是gcc的用法
例:
#include
int main(void)
{
printf ("Hello world, Linux programming!\n");
return 0;
}
在使用GCC编译程序时,编译过程可以被细分为四个阶段:
1.预处理(Pre-Processing)
2.编译(Compiling)汇编(Assembling)
3.链接(Linking)
gcc hello.c -o hello
在终端上直接执行./hello 则hello程序就执行啦
首先GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入“#include”语句所包含的内容;接着,GCC会调用ccl和as将处理后的源代码编译成目标代码;最后,GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序
第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:
# gcc -E hello.c -o
hello.i
此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成:
# gcc -c hello.i -o
hello.
GCC默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以使用-x参数让GCC从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执行文件:
# gcc hello.o -o hello
在采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC能够很好地管理这些编译单元。假设
有一个由foo1.c和foo2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序foo,可以使用下面这条命令:
# gcc foo1.c foo2.c -o
foo
如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:
# gcc -c foo1.c -o foo1.o
#
gcc -c foo2.c -o foo2.o
# gcc foo1.o foo2.o -o foo
在项目文件代码较多时,还要借助
像Make这样的工具
在这里介绍一下gcc 的选项解释
-c 只编译并生成目标文件。
-g 生成调试信息。GNU 调试器可利用该信息。
-o 生成指定的输出文件。用在生成可执行文件时。
-o2 进一步优化
介绍完了makefile 下面来介绍一下主角lseek()函数
它包含在 #include <unistd.h>头文件中
函数原型为:off_t lseek(int fildes, off_t offset, int whence);
若whence是 SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节
若whence是SEEK_CUR,则将该文件打偏移量设置为其当前值加offset,offset可为正或负
若whence是SEEK_END,则将该文件打偏移量设置为文件长度加offset,offset可正或负函数说明:
每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND),
则读写位置会指向文件尾. 当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置. 参数fildes
为已打开的文件描述词, 参数offset 为根据参数whence来移动读写位置的位移数
函数说明:
每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND),
则读写位置会指向文件尾. 当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置. 参数fildes
为已打开的文件描述词, 参数offset 为根据参数whence来移动读写位置的位移数。
还有exit(0)包含在#include <stdlib.h>中