Linux Day05

一、库文件生成与使用

1.1库文件

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

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

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

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

图片[1] - Linux Day05 - MaxSSL

图片[2] - Linux Day05 - MaxSSL

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

图片[3] - Linux Day05 - MaxSSL

1.2静态库

1.1.1 生成方法:

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

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

ar cv libxxx.a xxx.o

图片[4] - Linux Day05 - MaxSSL

图片[5] - Linux Day05 - MaxSSL

图片[6] - Linux Day05 - MaxSSL

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

直接调用会出错

图片[7] - Linux Day05 - MaxSSL

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

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

图片[8] - Linux Day05 - MaxSSL

成功运行

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

图片[9] - Linux Day05 - MaxSSL

答案是:可以

1.3共享库

1.2.1生成方法

第一步:先将需要生成库文件的所有“.c“文件编译成“.o”文件图片[10] - Linux Day05 - MaxSSL

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

图片[11] - Linux Day05 - MaxSSL

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

图片[13] - Linux Day05 - MaxSSL

当我们运行可执行文件时发现不能通过,报错图片[14] - Linux Day05 - MaxSSL

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

图片[15] - Linux Day05 - MaxSSL

两种办法解决

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

切换成管理员

图片[16] - Linux Day05 - MaxSSL

然后运行main可执行程序图片[17] - Linux Day05 - MaxSSL

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

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

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

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

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

图片[18] - Linux Day05 - MaxSSL

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

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

二、主函数的三个参数

int main( int argc, char* argv[], char* envp[]) (1) argc 参数个数 (2) argv 参数内容 (3) envp 环境变量图片[19] - Linux Day05 - MaxSSL

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

图片[20] - Linux Day05 - MaxSSL

当加入环境变量时

图片[21] - Linux Day05 - MaxSSL

图片[22] - Linux Day05 - MaxSSL

增加一个环境变量

图片[23] - Linux Day05 - MaxSSL

图片[24] - Linux Day05 - MaxSSL

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享