入门
一、UNIX、Linux、GNU简介
1、什么是UNIX
UNIX是由Open Group管理的一个商标,它指的是一种遵循特定规范的计算机操作系统。这个规范在很大程度上是早期由IEEE(电气和电子工程师协会)开发的 P1003 或 POSIX 规范的超集。
特点: 简单性 , 集中性 , 可重用组件 , 过滤器 , 开放的文件格式 , 灵活性 。
2、什么是Linux
Linux是一个可以自由发布的类UNIX内核实现,它是一个操作系统的底层核心。 几乎为UNIX编写的程序都可以在Linux上编译运行 。
3、GNU项目和自由软件基金会
Linux社区(以及其他的软件开发组织)支持自由软件的概念,即软件本身不应受限,它们应遵守 GNU (GNU是GNU’s Not UNIX的递归缩写)通用公共许可证( GPL )。
自由软件基金会由Richard Stallman创立,他是UNIX及其他系统上最著名的文本编辑软件之一GNU Emacs的开发者。Stallman是自由软件这一概念的倡导者,并发起了GNU项目,这个项目的宗旨是:试图创建一个与UNIX系统兼容,但并不受UNIX名字和源代码私有权限制的操作系统和开发环境。
GPL条款下发布的一些主要GNU项目软件:
GCC :GNU编译器集,它包括GNU C编译器。
G++ :C++编译器,是GCC的一部分。
GDB :源代码级的调试器。
GNU make :UNIX make命令的免费版本。
Bison :与UNIX yacc兼容的语法分析程序生成器。
bash :命令解释器(shell)。
GNU Emacs :文本编译器及环境。
二、Linux程序设计
1、Linux程序
Linux应用程序表现为两种特殊类型的文件:可执行文件 和 脚本文件。
搜索路径:
/bin:二进制文件目录,用于存放启动系统时用到的程序。
/usr/bin:用户二进制文件目录,用于存放用户使用的标准程序。
/usr/local/bin:本地二进制文件目录,用于存放软件安装的程序。
系统管理员登录后使用的PATH变量可能还包含存放系统管理程序的目录,如 /sbin 和 /usr/sbin。
可选的操作系统组件和第三方应用程序可能被安装在 /opt 目录下,安装程序可以通过用户安装脚本将路径添加到PATH环境变量中。
Linux像UNIX一样,使用冒号( : )分隔PATH变量里的条目 ,使用正斜号( / )分隔文件名里的目录名。
2、文本编辑器
较流行文本编辑器: vi ,vim
功能强大文本编辑器: Emacs
3、第一个Linux C程序
//hello.c
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello World!\n");
exit(0);
}
$ gcc -o hello hello.c
$ ./hello
Hello World!
gcc -o name 选项生成名为name的可执行程序,如果没有指定编译器会把程序放在一个名为 a.out 的文件里(a.out的含义是assembler output,即汇编输出)。
4、开发系统导引
应用程序
应用程序通常存放在系统为之保留的特定目录中。系统为正常使用提供的程序,包括用于程序开发的工具,都可以在目录 /usr/bin 中找到。
系统管理员为某个特定的主要或本地网络添加的程序通常可以在目录 /usr/local/bin 或 /opt 中找到。
对于个人开发和个人的应用程序,最好在自己的 家目录 使用一个文件夹来存放。
头文件
C语言:/usr/include
Linux:/usr/include/sys 和 /usr/incldue/linux
X视窗:/usr/include/X11
GNU C++:/usr/include/c++
在调用C语言编译器时,可以使用 gcc -I (大写的i)包含保存在子目录或非标准位置的头文件。
$gcc -I/usr/openwin/include fred.c
库文件
库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。
标准系统库文件一般存储在 /lib 和 /usr/lib 目录中。
库文件的名字总是以 lib 开头,随后的部分指明这是什么库(例如,c代表C语言库,m代表数学库)。
库文件类型:
.a 代表传统的静态函数库。
.so代表共享函数库。
$ gcc -o fred fred.c -lm
$ gcc -o fred fred.c /usr/lib/libm.a
可以通过给出完整的库文件路径名或用 -l(小写的L)标志来告诉编译器要搜索的库文件。
-lm之间没有空格,他表示标准库目录(本例是/usr/lib)中名为libm.a的函数库。如果有共享库,会自动选择 共享库 。
静态函数库
静态库,也称作 归档文件(archive)。
//fred.c
#include <stdio.h>
void fred(int arg) {
printf("fred: we passed %d\n", arg);
}
//bill.c
#include <stdio.h>
void bill(char *arg) {
printf("bill: we passed %s\n", arg);
}
$ gcc -c bill.c fred.c
$ ls *.o
bill.o fred.o
gcc -c编译生成目标文件。
//lib.h
void bill(char *);
void fred(int);
//program.c
#include <stdlib.h>
#include "lib.h"
int main() {
bill("Hello World!");
exit(0);
}
$ gcc -c program.c
$ gcc -o program grogram.o bill.o
$ ./program
bill: wepassed Hello World!
用ar程序创建一个归档文件并将目标文件添加进去。
$ ar crv libfoo.a bill.o fred.o
a - bill.o
a - fred.o
有些系统还需要为函数库生成一个内容表。
$ ranlib libfoo.a
现在可以使用函数库了。
$ gcc -o program program.o libfoo.a
$ ./program
bill: we passed Hello World!
gcc -L选项可以告诉编译器在哪查找函数库。
$ gcc -o program program.o -L. -lfoo
在当前目录查找函数库libfoo.a或者libfoo.so。
共享函数库
使内存中不会有同一函数的多份副本,减少内存和磁盘空间的消耗。