一、库文件生成与使用

1.1库文件

头文件是方法的声明,不是方法的实现

方法的实现是在库,库是预先编译好的方法的集合即.o文件

Linux上的库分为静态库(libxxx.a)和共享库(libxxx.so)

库文件常存放在/lib或者/usr/lib

库对应的头文件一般放在/usr/include中

1.2静态库

1.1.1 生成方法:

将所有的.c源文件编译成目标文件.o

将所有目标文件打包生成静态库,

ar cv libxxx.a xxx.o

由此可见头文件只有函数的声明,没有函数的实现

直接调用会出错

需要使用gcc -o main main.c -L. -lfoo

-L 指定库的存储路径 -L. .表明是在当前所在位置-l 指定库的名称(不需要前面的‘lib’和扩展名‘.a’)

成功运行

1.1.2删除静态库后能否正常运行可执行文件

答案是:可以

1.3共享库

1.2.1生成方法

第一步:先将需要生成库文件的所有“.c“文件编译成“.o”文件

第二步:使用 gcc 命令将第一步编译的所有”.o”文件生成共享库

第三步:使用共享库“libfoo.so”和“main.c”生成可执行文件的过程,其中 -L 指定库的 存储路径, -l 指定库的名称(不需要前面的‘lib’和扩展名‘.so’)

当我们运行可执行文件时发现不能通过,报错

是因为我们的共享库,main函数里面并没有包含Add,max的方法,只是标记我们要使用这个库里面的方法,并没有包含到main程序中,当我们运行时系统寻找共享库位置链接,而系统没有找见这个库所以出错了

两种办法解决

第一种:将共享库剪切至/usr/lib

切换成管理员

然后运行main可执行程序

使用ldd查看就能发现系统可以找到这个共享库的位置了

第二种:通过设置环境变量”LD_LIBRARY_PATH”来指定加载库的路径

如果在库的存储路径 有同名的共享库和静态库,gcc 默认使用共享库。

1.1.2删除共享库后能否正常运行可执行文件

当我们使用管理员身份删除libfoo.so文件后执行可执行文件发现会报错

1.4、静态库和共享库的区别

静态库在链接时将用到的方法包含到最终生成的可执行程序中,而共享库不包含,只做 标记,在运行程序时,才动态加载理论上共享库执行文件大小小于静态库的

二、主函数的三个参数

int main( int argc, char* argv[], char* envp[]) (1) argc 参数个数 (2) argv 参数内容 (3) envp 环境变量

在未传入任何参数,argc为1(当前程序的路径+名称), 参数内容是当前程序的名字

当加入环境变量时

增加一个环境变量