首页
最新活动
服务器租用
香港服务器租用
台湾服务器租用
美国服务器租用
日本服务器租用
新加坡服务器租用
高防服务器
香港高防服务器
台湾高防服务器
美国高防服务器
裸金属
香港裸金属服务器
台湾裸金属服务器
美国裸金属服务器
日本裸金属服务器
新加坡裸金属服务器
云服务器
香港云服务器
台湾云服务器
美国云服务器
日本云服务器
CDN
CDN节点
CDN带宽
CDN防御
CDN定制
行业新闻
官方公告
香港服务器资讯
帮助文档
wp博客
zb博客
服务器资讯
联系我们
关于我们
机房介绍
机房托管
登入
注册
帮助文档
专业提供香港服务器、香港云服务器、香港高防服务器租用、香港云主机、台湾服务器、美国服务器、美国云服务器vps租用、韩国高防服务器租用、新加坡服务器、日本服务器租用 一站式全球网络解决方案提供商!专业运营维护IDC数据中心,提供高质量的服务器托管,服务器机房租用,服务器机柜租用,IDC机房机柜租用等服务,稳定、安全、高性能的云端计算服务,实时满足您的多样性业务需求。 香港大带宽稳定可靠,高级工程师提供基于服务器硬件、操作系统、网络、应用环境、安全的免费技术支持。
联系客服
服务器资讯
/
香港服务器租用
/
香港VPS租用
/
香港云服务器
/
美国服务器租用
/
台湾服务器租用
/
日本服务器租用
/
官方公告
/
帮助文档
【Linux】动静态库
发布时间:2024-03-11 04:21:49 分类:帮助文档
【Linux】动静态库 文章目录 动静态库1. 设计库1. 静态库打包只有一个.o的压缩包报错1创建.o与.h的压缩包报错2第三方库的使用将头文件和库拷贝对应的系统路径 2. 动态库打包报错运行时报错找到动态库的方法方法1 ——环境变量(临时方案)方法2 ——建立软链接方法3——配置文件方案 动静态库 1. 设计库 库分为 静态库(.a)和动态库(.so) 库的命名 以c++的库为例 输入 ls /lib64/libstdc++* 以lib开头要去除 库的真实名字为 stdc++ 一般云服务器,默认只会存在动态库,不需要动态库,静态库需要单独安装 myadd.h 实现一个加法的声明 #pragma once int myadd(int d1,int d2); myadd.c 实现一个加法的实现 #include"myadd.h" int myadd (int d1,int d2) { return d1+d2; } mysub.h 实现一个减法的声明 #pragma once int sub(int d1,int d2); mysub.c 实现一个减法的实现 #include"mysub.h" int mysub(int d1,int d2) { return d1-d2; } main.c 实现对myadd和mysub的调用 #include
#include"myadd.h" #include"mysub.h" int main() { int x=100; int y=34; printf("%d+%d=%d\n",x,y,myadd(x,y)); E> printf("%d-%d=%d\n",x,y,mysub(x,y)); return 0; } 使用main.c mysub.c myadd.c 生成一个可执行程序 mytest 输入 gcc -o mytest myadd.c mysub.c main.c 指令 出于安全和便捷性考虑,都不想把源代码给别人,所以要把源代码打包 创建mylib目录代表自己 , otherperson目录代表其他人 main.c应该是另一个人用的代码,所以把main.c移动到otherprson目录中 输入指令 mv main.c otherperson/ 在链接之前把源代码编译成.o的二进制目标文件 把所对应的源文件 经过预处理 编译 汇编 形成 .o文件 分别通过myadd.c 与mysub.c形成 myadd.o 与 mysub.o 为了不想给别人交付源代码,把所有的.h文件拷贝到 otherperson里面 同时把 所有的.o文件 也拷贝到 otherperson里面 [yzq@VM-8-8-centos lesson1]$ cp *.h otherperson [yzq@VM-8-8-centos lesson1]$ cp *.o otherperson 在otherperson 目录中 将main.c形成一个main.o的文件 把add.o sub.o main.o 链接形成 mytest 可执行程序 此时在otherperson目录中 使用 mytest 可执行程序去执行 就可以了 但是把一大堆的头文件和目标文件都传给 otherperosn目录 调用有点太繁琐了 1. 静态库打包 只有一个.o的压缩包 tar - c :创建一个新的归档文件即压缩包 tar- r : 若.c文件修改了,则对一个或者多个.o文件做替换 当前目录下包含 mylib otherperson 目录 以及 .o和.c文件 [yzq@VM-8-8-centos lesson1]$ ar -rc libmymath.a *.o 将当前目录下的 所有.o目标文件打包 并命名为 libmymath.a 在otherperson目录中,删除之前所预留的所有.o与.h文件以及 myetst可执行程序 此时otherperosn目录中只剩下 main.c 重新在mylib目录中取.o与.a文件 此时otherperson目录中存在.h文件 与main.c 以及 .o目标文件的压缩包 报错1 输入 gcc - o myetst main.c 指令 会报错 有库后,将库引入项目,必须让编译器找到头文件和库文件 因为引入的库 属于第三方库,gcc并不能理解用的那个库,要让编译器认识这个库 加入 -l选项 要链接哪一个库 此时依旧会报错 加入-L.选项 对应的库在那个路径下 输入 gcc -o mytest main.c -L. -lmymath 指令 即可正常运行可执行程序 创建.o与.h的压缩包 在mylib目录下 创建include目录 与 lib目录 拷贝所有的.h文件放在include目录下 ,拷贝所有的.a文件放在lib目录下 所以未来是将这两个目录传给用户 tar - c :创建一个新的归档文件即压缩包 tar - z : 使用打包的同时可以进行压缩 tar - f : 给归档文件一个名字 建议把 f 放在最后 tar -czf + 文件名.tgz +文件名 将dir与include两个目录进行打包 生成 mymath.tgz 在otherperson目录下 将属于mylib目录下的压缩包 mymath.tgz 拷贝到 otherperson 目录下 tar -x 解开文件 tar -xzf 文件名.tgz 使用 tar xzf 进行解包 报错2 头文件找不到 因为头文件在inlcude 里,不在当前路径下 在include的路径下,寻找头文件 依旧报错了,但是头文件找到了 告诉编译器库在lib中 还是会报错 ,因为lib库并不属于c/c++的标准库 还需要告诉库的名字是什么 将独立的将库引入otherperson中 ,可以正常运行 第三方库的使用 第三方库的使用 1.需要的是指定的头文件和库文件 2.如果没有默认安装到系统的gcc/g++默认的搜索路径下,用户必须指明对应的选项,告知编辑器, 头文件在哪里,库文件在哪里,库文件具体是谁 将头文件和库拷贝对应的系统路径 在otherperson目录下 将当前include下的所有内容拷贝到系统对应的include路径下 查看系统路径中就存在 myadd.h 与mysub.h 将dir拷贝到库的搜索路径下 由于将include对应的文件传入系统路径中以及将dir对应的文件传入库的搜索路径下 , 此时otherperson目录下只存在 main.c 文件 刚刚拷贝过去的库,属于非C/C++标准的库,所以被认为是第三方库 告诉它需要链接mymath库,就可以正常运行了,而不需要告诉头文件 将下载下来的库和头文件,拷贝到系统默认路径下,这个行为就叫做在Linux下安装库 对于任何软件而言,安装和卸载的本质是拷贝到系统特定的路径下如果要安装第三方的库,(第一方库是语言,第二方库是操作系统系统接口),要正常使用,即便已经全部安装到系统中,gcc/g++必须用 -l 来指明具体库的名称 2. 动态库打包 在mylib目录下 制作动态库也需要.o目标文件,再将目标文件打包 动态库打包不使用 ar,而是直接使用gcc 并且加上 fPIC的选项 P代表 position 位置 I代表 independent 忽略 C 代表 code 生成myadd.o与mysub.o的目标文件,并形成与位置无关码 shared选项 代表打包的是一个共享库/动态库 将myadd.o 与mysub.o打包 成动态库,并命名为 mymath 在mylib目录下 使用 mkdir 分别创建 目录 include 与lib 将所有的.h文件拷贝到 include 目录下 即 include中存在头文件 将所有的.so文件拷贝到 lib目录下 即 lib中存在 动态库 将include 与lib 打包,并命名为 mymath.tgz 将 mymanth.tgz 这个包 拷贝到 otherperson目录中 在otherperson目录下 此时的otherperson目录下存在 mymanth.tgz 与main.c 通过 xzf 解包,显示出 include (存放头文件)与 lib (存放动态库) 报错 显示找不到头文件 加入-I后,在include下寻找头文件,但依旧会报错 ,因为找不到库了 加入 -L 后在lib 中寻找库 ,并加入-lmymath ,链接库mymath 运行时报错 但是在运行生成的可执行程序mytest时,还是会报错 说明链接时,动态库并没有真正链接到可执行程序 在上面 gcc 时,已经告诉系统库在哪里,叫什么了,为什么还是找不到? 只是告诉了编译器,并不是操作系统 运行时,你的.so并没有在系统默认的路径下,所以操作系统依旧找不到 找到动态库的方法 方法1 ——环境变量(临时方案) LD_LIBRARY_PATH LD代表链接 LIBRARY 代表库 PATH 代表路径 显示为库的路径 将当前库的路径添加到环境变量中 查询环境变量时,发现当前库的路径已经在环境变量中 再次查看第三方库时,mymath.so有对应的第三方库了 此时mytest可以正常执行了 但是环境变量只在本次登录有效,若退出再进入,则环境变量还是找不到 方法2 ——建立软链接 在系统默认的路径下,建立一个软链接指向库 此时软链接指向这个库 查看第三方库时,libmymath.so有自己的第三方库 软链接是一个文件,所以即便关闭xshell,再次打开也能正常运行mytest 可执行程序 方法3——配置文件方案 使用 ldd 找不到 libmymath对应的第三方库 在系统当中存在配置文件 ld代表链接库 so代表动态库 conf代表配置文件 创建一个配置文件,并命名为look 输入 ls /etc/ld.so.conf.d/ 指令 查看系统的配置文件,就发现多了一个look的配置文件 由于动态库存放在otherperosn目录下的lib中, 所以进入lib目录中,显示当前库的路径,将其复制 使用vim进入自己创建的配置文件中,并把 上述复制好的库的路径粘贴到里面 输入 ldd mytest 指令,发现还是找不到第三方库 查看自己的配置文件时,已经有了对应的库的路径 还需让其生效 输入 sudo ldconfig 指令 就会让系统加载新的配置文件 即可正常运行程序
上一篇
香港 cdn
下一篇
万网域名 香港
相关文章
标准互联服务器怎么样
Linux安装及管理应用和账号和权限管理 讲解
阿里云的云主机怎么用
查已备案域名怎么办
100M服务器能同时容纳多少人访问?
Flask——基于python完整实现客户端和服务器后端流式请求及响应
【Linux】rpm && yum(软件包的安装以及查询)
com域名不备案会怎么样
备案网站无法进入怎么办
香港云服务器租用推荐
服务器租用资讯
·广东云服务有限公司怎么样
·广东云服务器怎么样
·广东锐讯网络有限公司怎么样
·广东佛山的蜗牛怎么那么大
·广东单位电话主机号怎么填写
·管家婆 花生壳怎么用
·官网域名过期要怎么办
·官网邮箱一般怎么命名
·官网网站被篡改怎么办
服务器租用推荐
·美国服务器租用
·台湾服务器租用
·香港云服务器租用
·香港裸金属服务器
·香港高防服务器租用
·香港服务器租用特价
7*24H在线售后
高可用资源,安全稳定
1v1专属客服对接
无忧退款试用保障
德讯电讯股份有限公司
电话:00886-982-263-666
台湾总部:台北市中山区建国北路一段29号3楼
香港分公司:九龙弥敦道625号雅兰商业二期906室
服务器租用
香港服务器
日本服务器
台湾服务器
美国服务器
高防服务器购买
香港高防服务器出租
台湾高防服务器租赁
美国高防服务器DDos
云服务器
香港云服务器
台湾云服务器
美国云服务器
日本云服务器
行业新闻
香港服务器租用
服务器资讯
香港云服务器
台湾服务器租用
zblog博客
香港VPS
关于我们
机房介绍
联系我们
Copyright © 1997-2024 www.hkstack.com All rights reserved.