1. linux应用程序
可执行文件:计算机可以直接运行的程序;
脚本文件:一组指令的集合,这些指令将由另一个程序(即解释器)来执行,相当于windows 的.bat ,.cmd 文件。
2.PATH变量,添加路径,使用(:)分隔
3.Linux使用正斜线(/)分隔文件名里的目录名,
4.头文件:提供对常量的定义和对系统函数及库函数调用的声明
一般位于/usr/include目录及其子目录中;
依赖于特定Linux版本的头文件可在目录/usr/include/sys和usr/include/linux中找到;
使用-I标志来包含在子目录或非标准位置中的头文。$ gcc -I/usr/include/mysql cb1.c (意思?)
5. grep 命令搜索包含某些特定定义和函数原形的头文件
$ grep EXIT_ *.h
6.库文件:一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。
函数库最简单的形式是一组处于“准备好使用”状态的目标文件。当程序需要使用函数库中的某个函数时,它包含一个声明该函数的头文件。编译器和链接器负责将程序代码和函数库结合在一起以组成一个单独的可执行文件。
标准系统库文件一般存储在/lib和/usr/lib目录下(libm.a==lm),最好使用lm形式(简写,自动选择共享库)
-L为编译器增加库的搜索路径 $ gcc –o db –L/usr/lib64/mysql –lmysqlclient cb1.o
例:$ gcc -I/usr/include/mysql cb1.c -o db2 -L/usr/lib64/mysql -lmysqlclient
库文件的名字总是以lib开头,随后的部分指名这是什么库
.a —静态函数库 (包含在可执行程序中)
.so—共享函数库 (在程序运行时加载)
7.静态库的使用步骤:
(1).为两个函数fred和bill分别创建各自的源文件(fred.c和bill.c):
#include <stdio.h>
void fred (int arg)
{
printf( “fred: we passed %d\n”,arg);
}
#include <stdio.h>
void fred (char * arg)
{
printf( “bill: we passed %s\n”,arg);
}
(2) 编译,使用-c选项的作用是阻止编译器创建一个完整的程序
$ gcc –c bill.c fred.c
$ ls *.o
(3) 编写调用bill的程序
创建一个头文件:声明库文件中的函数
lib.h
void bill ( char * );
void fred ( int );
(4) 调用程序(program.c):包含库的头文件并且调用库中的一个函数
#include <stdio.h>
#include “lib.h”
int main ( )
{
bill ( “Hello World”);
exit(0);
}
(5) 编译与链接
$ gcc –c program.c
$ gcc –o program program.o bill.o
$ ./program
(6) 创建并使用一个库文件。
ar 将若干个单独的文档归并到一个大的文件中以创建归档文件或集合。
使用ar 程序创建任何类型文件的归档文件
$ ar crv libfoo.a bill.o fred.o
(7) 为函数库生成一个内容表(非必须)
$ ranlib libfoo.a
现在函数库就可以使用了
$ gcc -o program program.o libfoo.a
使用-L选项来访问函数库
$ gcc -o program program.o -L. -lfoo
-L.选项告诉编译器在当前目录(.)中查找函数库;
-lfoo选项告诉编译器使用名为libfoo.a的函数库;
nm查看目标文件、函数库或可执行文件包含的函数。(例,nm program;nm libfoo.a;nm bill.o)
8. 共享库(lib.so)
静态库的缺点:当同时运行的许多应用程序都使用来自同一个函数库的函数时,内存中就会有同一函数的多份副本,而且在程序文件自身也有多份同样的副本。这将消耗大量的内存和磁盘空间。
共享库的链接方式:程序本身不再包含函数代码,而是引用运行时可访问的共享代码。当编译好的程序被加载到内存中执行时,函数引用被解析并产生对共享库的调用,如果有必要,共享库才被加载到内存中。
使用ldd 命令来查看一个程序需要的共享库
$ ldd program
9. man 访问在线手册页
$ man gcc