1.Linux社区支持自由软件的概念,即软件本身不应受限,它们应遵守GNU(GNU是GNU’s notUNIX的递归缩写)通用公共许可证(GPL)。
2.Linux应用程序表现为两种特殊类型的文件:可执行文件(类windows下的.exe文件)和脚本文件(类似于windows下的.dat批处理文件)。
3.Linux和UNIX一样,使用冒号分隔PATH变量里的条目,而不是像MS-DOS和Windows使用分号。Linux用正斜线(/)分隔文件名里的目录名,而Windows使用反斜线(\)。
4.在调用C语言编译器时,可以使用-I标志来包含保存在子目录或非标准位置中的头文件。例如:gcc–I/usr/niukun test.c
这指示编译器不仅在标准位置,也在/usr/niukun目录中查找程序test.c中包含的头文件。
5.使用grep命令来搜索包含某些特定定义和函数原型的头文件非常方便。例如需要搜索test.c文件中包含include字符的语句,那么可以在终端输入:
# grep include test.c
6.库文件的名字总是以lib开头,随后的部分说明这是什么库,文件名的最后部分以.开始,然后给出库文件的类型:
.a代表传统的静态函数库;
.so代表共享函数库。
# gcc –o test test.c /usr/lib/libm.a
这条命令要求编译器除了搜索标准的C语言函数库外,还搜索数学库以解决函数引用问题。
虽然库文件和头文件一样,通常保存在标准位置,但是也可以通过-L标志位编译器增加库的搜索路径。例如:
# gcc –o test –L/usr/niukun/lib test.c –lx11
-lx11=/sr/lib/libx11.a或者/sr/lib/libx11.so(优先共享库)
这条命令用/usr/niukun/lib目录中的libx11(-lx11为简写形式)库版本来编译和链接程序test。
7.实验——静态库
(1)编写fred.c和bill.c。
(2)使用# gcc –c bill.c fred.c
通过这步之后,文件夹里面多出了bill.o和fred.o两个文件。-c选项的作用是组织编译器创建一个完整的程序,况且此时无法创建一个完整的程序,因为没有定义main函数。
(3)编写一个调用bill或者fred函数的程序。首先创建一个头文件lib.h里面包含:fred和bill函数的声明。然后编写一个程序program.c,加载头文件lib.c并调用其中的函数。
(4)# gcc –c program.c
到这步,程序已经可以运行成功。
(5)创建一个库文件。使用ar程序创建一个归档文件并将自己的目标文件添加进去,ar程序也可以用来创建任何类型文件的归档文件。创建命令为:
# ar crv libfoo.a bill.o fred.o
(6)库文件创建好了,要想成功的使用函数库,还需要为函数库生成一个内容表(这一步在使用GNU的软件开发工具时不是必需的),这可以通过ranlib命令实现。
# ranlib libfoo.a
现在函数库已经可以使用。测试如下:
# gcc –o program program.o libfoo.a
# ./program
也可以使用-l选项来访问函数库,但是因为库的保存位置不是标准位置,所以需使用-L选项来告诉编译器位置信息:
# gcc –o program program.o –L. –lfoo
注意:.表示当前目录。
8.共享库
静态库的缺点:当同时运行许多应用程序并且它们都使用来自同一个函数库的函数时,内存中就会有同一个函数的多个副本,并且在程序文件自身中也会有多份副本存在。
当一个程序使用共享库时,它的链接方式是这样的:程序本身不再包含函数代码,而是引用运行时可以访问的共享代码。当编译好的程序被装载到内存中执行时,函数引用被解析并产生对共享库的调用,如果有必要,共享库才被加载到内存中。
好处:这样系统可以只保留一份副本供许多应用程序同时使用,并且在磁盘上也仅保存一份。另一个好处是方便更新函数。
可以通过工具ldd查看一个程序需要的共享库。例如:
# ldd program
.so库对应于Windows的.DLL文件,而.a库类似于.LIB文件。
9.手册页和info
需要查看帮助的时候,可以使用man命令或者info命令:
man gcc
info gcc