【1. linux applications 有两种形式】
i)可执行的文件: 可由计算机直接运行,相当于windows的.exe文件
ii)Script: collections of instructions for another program. 相当于windows的.bat .cmd文件
【2. PATH】
在Linux中,当输入程序名(如Firefox)时,系统会在名为PATH的Shell变量所给定的一系列目录中寻找是否有同名的文件。
查看PATH的值,在Linux: $PATH 或者 echo $PATH
windows: PATH
Linux可执行文件位置说明:
/bin: binaries, programs used in booting the system
/usr/bin: user binaries, standard programs available to users
/usr/local/bin: local binaries, programs specific to an installation
当以administator身份进入时,可能会使用系统管理程序所在的PATH目录,如: /sbin 或 /usr/sbin
Linux,like unix, 在PATH变量的entries之间用colon(:)分隔,而windows和ms-dos用semicolon (;) 分隔。
Linux:使用forward slash (/) 来分隔目录
eg: /usr/bin/
windows: 使用backward slash (/)来分隔
eg: c:/Documents and settings/user>
【3. C compiler】
在POSIX-compliant system (POSIX: Portable Operating System Interface), C compiler is called c89.
in linux, c89, cc, gcc refer to the system c compiler.
【4. first c program in linux】
1) hello.c file content
#include <stdio.h> #include <stdlib.h> int main() { printf("Hello World!/n"); }
2) compile
$gcc -o hello hello.c
gcc参数说明:
-o <file>:输出到file,若未指定-o,则default输出到a.out
如果要查看中间生成文件,可用gcc参数 -save-temps
$gcc -save-temps -o hello hello.c
$ls
hello hello.c hello.i hello.o hello.s
//以上生成的4个文件说明见【5.编译系统】
3) execute
$./hello
说明:
若直接用hello,即执行
$hello
则系统会在Shell变量PATH所列出的目录中search,若恰好有一个名为
hello的文件,则执行之。
./: 代表当前目录。
【5.编译系统】
预处理阶段
预处理器(cpp)根据以字符#开头的命令(directive),修改原始的C程序。比如hello.c中的第一行的#include<stdio.h>指令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入到程序文本中去。结果就得到了另一个C程序,通常是以.i作为文件扩展名。
编译阶段
编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。
汇编阶段
汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成为一种叫做可重定位(relocatable)目标程序的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是极其语言指令而不是字符,如果我们在文本编辑器中打开hello.o文件,呈现的将是一堆乱码。
链接阶段
我们的hello程序调用了printf函数,它是标准c库中的一个函数,每个C编译器都提供。printf函数存在于一个名为printf.o的单独的预编译目标文件中,而这个文件必须以某种方式并入到我们的hello.o程序中。链接器(ld)就负责处理这种并入,结果就得到hello文件,它是一个可执行目标文件,可执行文件加载到存储器后,由系统负责执行。