一、库文件生成与使用
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(当前程序的路径+名称), 参数内容是当前程序的名字
当加入环境变量时
增加一个环境变量