Linux下的C编程实战(2)


怎样为上述三个文件产生makefile呢?如下:
-------------------------
test : main.o add.o
gcc main.o add.o -o test
 
main.o : main.c add.h
gcc -c main.c -o main.o
 
add.o : add.c add.h
gcc -c add.c -o add.o
-----------------------

(注意分割符为TAB键)

上述makefile利用add.c和add.h文件执行gcc -c add.c -o add.o命令产生add.o目标代码,利用main.c和add.h文件执行gcc -c main.c -o

main.o命令产生main.o目标代码,最后利用main.o和add.o文件(两个模块的目标代码)执行gcc main.o add.o -o test命令产生可执行文件

test。

我们可在makefile中加入变量,另外。环境变量在make过程中也被解释成make的变量。这些变量是大小写敏感的,一般使用大写字母。Make变

量可以做很多事情,例如:

i) 存储一个文件名列表;

ii) 存储可执行文件名;

iii) 存储编译器选项。

要定义一个变量,只需要在一行的开始写下这个变量的名字,后面跟一个=号,再跟变量的值。引用变量的方法是写一个$符号,后面跟(变量

名)。我们把前面的 makefile 利用变量重写一遍(并假设使用-Wall -O –g编译选项):   

OBJS = main.o add.o

CC = gcc

CFLAGS = -Wall -O -g

test : $(OBJS)

$(CC) $(OBJS) -o test

main.o : main.c add.h

$(CC) $(CFLAGS) -c main.c -o main.o

add.o : add.c add.h

$(CC) $(CFLAGS) -c add.c -o add.o

makefile 中还可定义清除(clean)目标,可用来清除编译过程中产生的中间文件,例如在上述makefile文件中添加下列代码:

clean:

rm -f *.o

运行make clean时,将执行rm -f *.o命令,删除所有编译过程中产生的中间��件。

不管怎么说,自己动手编写makefile仍然是很复杂和烦琐的,而且很容易出错。因此,GNU也为我们提供了Automake和Autoconf来辅助快速自动

产生makefile,读者可以参阅相关资料。

5.小结

本章主要阐述了Linux程序的编写、编译、调试方法及make,实际上就是引导读者学习怎样在Linux下编程,为后续章节做好准备。


Linux下的C编程实战(二)

――文件系统编程

1.Linux文件系统

Linux支持多种文件系统,如ext、ext2、minix、iso9660、msdos、fat、vfat、nfs等。在这些具体文件系统的上层,Linux提供了虚拟

文件系统(VFS)来统一它们的行为,虚拟文件系统为不同的文件系统与内核的通信提供了一致的接口。下图给出了Linux中文件系统的关系:

<!--[if !vml]--><!--[endif]-->

在Linux平台下对文件编程可以使用两类函数:(1)Linux操作系统文件API;(2)C语言I/O库函数。    前者依赖于Linux系统调用,

后者实际上与操作系统是独立的,因为在任何操作系统下,使用C语言I/O库函数操作文件的方法都是相同的。本章将对这两种方法进行实例讲

解。

2.Linux文件API

Linux的文件操作API涉及到创建、打开、读写和关闭文件。

创建

int creat(const char *filename, mode_t mode);

参数mode指定新建文件的存取权限,它同umask一起决定文件的最终权限(mode&umask),其中umask代表了文件在创建时需要去掉的一些存取

权限。umask可通过系统调用umask()来改变:

int umask(int newmask);

该调用将umask设置为newmask,然后返回旧的umask,它只影响读、写和执行权限。

打开

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

open函数有两个形式,其中pathname是我们要打开的文件名(包含路径名称,缺省是认为在当前路径下面),flags可以去下面的一个值或者是几

个值的组合:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1886398572ec6070cfe1e70d62001701.html