企业网站建设需要考虑内容,免费咨询聊天,微网站注册,新浪舆情系统文章目录什么是库#xff1f;静态库打包方式使用方式生成并执行可执行程序粗暴方式优化方式动态库不一样的.o文件打包方式使用方式生成可执行程序运行可执行程序无法运行时的解决方案动静态库与动静态链接什么是库#xff1f;
从一开始的helloworld#xff0c;到现在熟练使…
文章目录什么是库静态库打包方式使用方式生成并执行可执行程序粗暴方式优化方式动态库不一样的.o文件打包方式使用方式生成可执行程序运行可执行程序无法运行时的解决方案动静态库与动静态链接什么是库
从一开始的helloworld到现在熟练使用编程我们在无时不刻的使用库。可以想一下我们明明没有写printf函数的实现但是加上头文件后却可以使用它。
我们想一下可执行程序的生成过程预处理、编译、汇编、链接。前三步是将一个源文件.c变成一个可重定向目标二进制文件.o最后一步的链接是将无数个.o文件集合成一个可执行程序。
那么如果使用者只持有自己的.c文件和别人的.o文件和.h文件这不就成了。.h文件供使用者查看方法.o文件供使用者调用方法。 如果.o文件非常多可以将它打包一下所以最终打包好的.o文件就是库.h文件不用打包是让人和编译器看的。而所谓的动态库、静态库只是打包.o文件的方式不同。
静态库
打包方式
ar -rc 静态库名 要打包的.o文件示例
lib是静态库的前缀a是静态库的后缀。
使用方式
先将库下载到本地然后解压。 生成并执行可执行程序
粗暴方式 -I选项查找头文件路径 显示我们找不到add.h那么我们加上路径要让编译器知道头文件的路径。 -L选项查找库文件路径 -l选项增添库文件名 显示add、sub的非法引用也就是找不到add、sub的函数实现所以加上路径。 还是不成功这是因为即使给了库路径不给库名称gcc编译器也是无法找到的所以再加上名称。 Tips:库文件名不是libmyfunc.a而是去掉前缀后缀后的myfunc。
一步命令到位
优化方式
上面的方式要敲的指令实在太多了。我们可以将我们的头文件和库文件拷贝到系统路径下俗称安装这样就不需要我们手动敲前两条命令了对于第三方库第三条命令我们是必须手动加的。那么为什么c、c库我们不需要加呢这是因为gcc、g编译器就是专门编译c、c的所以gcc、g能自主的去寻找c库、c库。 由于是往系统路径下拷贝内容所以一般需要提升权限。 现在只需要输入第三条指令就可以了。
但是不推荐这种方式除非你写的头文件和库非常好否则不推荐弄到系统路径下
动态库
不一样的.o文件
打包成静态库的.o文件就是我们用普通的gcc -c命令生成的但是要打包成静态库的.o文件需要额外加一个参数-fPIC该参数能让.o文件生成与位置无关码。
一般的.o文件里有线性地址但是-fPIC生成的.o文件里并不是线性地址而是偏移量地址。
gcc -fPIC -c 源文件打包方式
gcc -shared -o 动态库名 要打包的.o文件使用方式
先将库下载到本地然后解压。
生成可执行程序
以上静态库的两种方式在动态库这里一样适用。
运行可执行程序
当我们运行程序的时候会发现这样的问题
然后我们用ldd命令查看该程序 显示找不到我们的动态库。
这是因为我们的程序里只有动态库里函数的偏移量地址但是却没有动态库的地址我们运行程序的时候shell和OS也没有告诉程序哪里有动态库地址所以就会出现该提示。
无法运行时的解决方案 将动态库拷贝到系统路径下。此时不需要拷贝头文件因为此时已经生成可执行程序了 将动态库路径添加到环境变量LD_LIBRARY_PATH 在目录/etc/ld.so.conf.d/里创建一个后缀为.conf的文件然后将动态库路径拷贝到该文件里即可。
动静态库与动静态链接
一个程序是静态链接还是动态链接取决于特定的库是静态库还是动态库。
若一份代码只有动态库则gcc只能动态链接
若一份代码只有静态库则gcc只能静态链接
若一份代码动、静态库都有则gcc默认动态链接加选项-static静态链接。
并且一份程序是可能动静态库都用的针对动态库用动态链接针对静态库用静态链接。