1、linux中使用 -I来指定头文件所在的路径;
2、可以在某个目录下查找:例如在/usr/include 目录下查找EXIT_结尾的宏定义,可以用grep EXIT_ *.h
3、在linux中库是预先编译好的一组函数的集合,他们是按照可重用的原则编写的。在linux中标准库文件一般存储在/usr/lib和/lib目录下面。linux中库的名字是有一定的规则的:以lib开始,后面表示的具体什么库,比如(c表示c语言库,m表示数学库);.a结尾的是静态库,.so结尾的是动态库。在编译c文件的时候 如果需要用到数学库,可以在编译的时候 -lm,这就表示使用标准库目录中的libm.a, 使用-lm的这样的好处是当有共享库的时候,会优先选择共享库。如果需要指定搜索的库的路径,可以使用-L来指定。
4、在未写main函数之前如果想要验证语法的正确性,可以使用gcc -c text.c 进行编译;
5、在linux中编译静态库:
假如:我们创建add.c和dec.c这两个函数实现的功能分别是求和和做差的功能:
在add.c文件中
#include <stdio.h>
int add(int a,int b)
{
return (a+b);
}
在dec.c文件中
#include <stdio.h>
int dec(int a,int b)
{
return (a-b);
}
然后gcc -c add.c dec.c 编译成功,会生成对应的.o文件;
现在我们可以编写main函数验证这个库是可以使用的:
在main.c中:
#include <stdio.h>
#include <stdlib.h>
#include "lib.h" //这个头文件中声明int add(int,int)和int dec(int,int)函数的
int main(int argc,char *argv[])
{
printf("add=%d.\n",add(3,4));
return 0;
}
gcc -o app main.c add.o dec.o 编译成功,运行./app可以输出7,说明这个库是正确的;
现在我们生成静态库:(使用ar工具)
ar crv libfoo.a add.o dec.o
a - add.o
a - dec.o
-c 如果存档文件不存在,则创建,并不显示ar发出的警告;-r 向存档文件中插入.o文件,替换已有的任何同名文件,新成员添加到文档末尾;-v表示详细显示程序执行的信息。
然后我们可以gcc -o app main.c libfoo.a;
如果使用gcc -o app main.c -lfoo 需要用-L来指定搜索的静态的当前路径:即:gcc -o app main.c -L. -lfoo才可以,因为默认是到标准库目录中去找库文件的。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
当多个函数都使用静态库时,就会出现一个函数的多个副本;因此共享库是为了解决这个问题,简单的理解就是只有当程序呗加载到内存中运行时,才会调用到共享库,程序不运行时,是不会加载动态库的。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
$#:表示传递给脚本的参数的个数;
$$:表示脚本的进程号
$0:表示脚本的名字