当前位置: 首页 > news >正文

青岛网站建设推广服务丰县网站建设

青岛网站建设推广服务,丰县网站建设,wordpress模板和下载不同,华西医院网站开发文章目录#xff1a;什么是程序库#xff1f;动态链接和静态链接动静态库的认识静态库的创建与使用创建使用动态库的创建与使用创建使用什么是程序库#xff1f; 程序库#xff1a;一般是软件作者为了发布方便、替换方便或二次开发目的#xff0c;而发布的一组可以单独与应… 文章目录什么是程序库动态链接和静态链接动静态库的认识静态库的创建与使用创建使用动态库的创建与使用创建使用什么是程序库 程序库一般是软件作者为了发布方便、替换方便或二次开发目的而发布的一组可以单独与应用程序进行 compile time 或 runtime 链接的二进制可重定位目标码文件。通俗来讲一个库就是一个文件这个文件可在编译时由编译器直接链接到可执行程序中也可以在运行时由操作系统的 runtime environment 根据需要动态加载到内存中。 实际上每个程序都需要依赖很多基础的底层库因此库的存在是非常中重要的。库有两种 静态库.a、.lib程序在编译链接的时候把库的代码链接到可执行程序中。程序运行时将不再需要静态库。动态库.so、.dll程序在执行的时候才去链接动态库的代码多个程序共享动态库的代码。 库命名约定 库通常以前缀 “lib” 命名。对于所有的C标准库都是如此。在连接时对库的命令引用将不包含库的前缀或后缀。 动态链接和静态链接 动态链接在可执文件开始运行之前外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中这个过程就称为动态链接dynamic linking。 动态库存储在磁盘中它可以由很多个进程共享所以动态链接使得可执行文件更小。若某个程序需要使用某个动态库时只需要在该进程的进程地址空间的共享区开辟空间然后通过该进程的页表将物理内存中的动态库映射到该进行的虚拟内存中。 静态链接可执行程序编译链接时将程序中使用到的静态库的代码拷贝到该可执行程序中。 动静态库的认识 如下所示在 Linux 下编写一个简单的程序接下来我们将用该程序来认识一下动静态库。 在该程序中我们通过调用 printf 来输出目标字符串而 printf 是库函数。因此在使用 gcc 编译此程序时将C标准库也链接进来了。 在 Linux 下可以通过指令 ldd 可执行程序名 来查看一个可执行程序所依赖的库文件 从上图可看出libc-2.17.so 实际上就是一个动态库。在 Linux 下.so 为后缀的是动态库.a 为后缀的是静态库。 gcc/g 编译器默认生成的二进制程序都是动态链接的如果想要实现静态链接可以在使用 gcc/g 编译文件时加上 -static 选项。 采用静态链接生成的可执行程序不依赖其它库文件使用指令 ldd 可执行程序名 可以查看该可执行程序所依赖的库文件如下所示 静态库的特点 静态库对库函数的链接是放在编译时期完成的。程序在运行时将与函数库无任何联系便于移植。静态链接生成的可执行程序非常大浪费空间和资源因为所有相关的目标文件与牵涉到的函数库将被链接形成一个可执行文件。 动态库的特点 动态库将一些库函数的链接载入推迟到程序运行的时期。可以实现进程之间的资源共享。因此动态库也称为共享库将一些程序升级变得简单。可以真正做到链接载入完全由程序员在程序代码中控制显示调用。 静态库的创建与使用 创建 静态链接库其实就相当于压缩包其内部可以包含多个源文件。需要注意的是并不是任意一个源文件都可以被加工成静态链接库其至少需要满足以下两个条件 源文件中只提供可重复使用的代码如函数、设计好的类等其中不能包含 main 函数源文件在实现具备模块功能的同时还需要提供访问它的接口也就是各个功能模块声明部分的头文件 接下来我们将演示如何创建一个静态库以下面四个文件为例其中两个源文件 calc.c 和 Print.c 两个头文件 calc.h 和 Pint.h 1、接下来先编译所有的源文件生成对应的目标文件 2、一旦我们有了一个目标文件或多个文件就使用 GNU ar 命令来将所有的目标文件创建成最终的库 ar 命令是 GNU 的归档工具常用于将目标文件打包为静态库下面我们将使用 ar -rc 命令来对目标文件进行打包。 -r replace 在库中插入模块替换。当插入的模块名已经在库中存在则替换同名的模块。如果若干模块中有一个模块在库中不存在ar 显示一个错误信息并不替换其它同名模块。默认情况下新的成员增加在库的结尾处可以使其它任选项来改变增加的位置。-c create 创建一个库。不管库是否存在都将创建。 ar -rc libcalc.a calc.o Print.o我们可以使用 ar -tv 来查看静态库中包含的文件 ar -tv libcalc.a 3、将头文件和生成的静态库组织起来 当我们将自己的静态库给别人使用时实际上需要给出两个文件夹一个文件夹下面存储静态库中的所有头文件另一个文件夹下存储所有的库文件。 创建一个目录 mathlib 在该目录下创建 include 和 lib 目录将 calc.h 和 Print.h 这两个头文件放到 include 目录下将生成的静态库文件 libcalc.a 放到 lib 目录下然后就可以将 mathlib 给别人用了。 使用 makefile 将以上步骤组织起来形成 makefile 文件。 libmath.a:calc.o Print.oar -rc libmath.a calc.o Print.ocalc.o:calc.cgcc -c calc.c -o calc.o -stdc99 Print.o:Print.cgcc -c Print.c -o Print.o -stdc99 .PHONY:output output:mkdir -p lib-static/lib mkdir -p lib-static/includecp *.a lib-static/lib cp *.h lib-static/include.PHONY:clean clean:rm -rf *.o *.a lib-static 写好 makefile 以后我们就可以将静态库进行一键发布。首先使用 make 生成所有目标文件对应的源文件然后 make output 将这些目标文件与静态库文件组织起来 使用 Linux 下使用静态库只需要在编译的时候指定静态库的搜索路径-L选项、指定静态库名不需要 lib 前缀和 .a 后缀-l选项、指定头文件的搜索路径-I选项。 -L表明静态库的搜索路径-l指定链接时需要的库编译器查找库时由隐含的命令规则即在给出的i那个字前面加上 lib后面加上 .a 或 .so 来确定库的名称。-I指定头文件的搜索路径 gcc test.c -I./lib-static/include -L./lib-static/lib -lmath注意-I-L-l 这三个选项后面可加空格也可以将空格省略掉。 另一种方法将头文件和库文件拷贝到存储系统头文件和系统库文件的路径下。 sudo cp lib-static/include/* /usr/include/ sudo cp lib-static/lib/* /lib64/这个就不演示了。该方法采用的是直接将我们写好的库的头文件和库文件直接拷贝到系统路径下虽然该方法比较简单但是不推荐使用此方法因为这样会对系统文件造成污染。 动态库的创建与使用 创建 共享库或动态链接库dll具有在多个程序之间共享一个库副本的巨大优势因此称为共享库将它们与多个程序链接的过程称为动态链接。接下来将演示如果在 Linux 上创建和使用共享库。 1、让所有源文件生成对应的目标文件 在这里用源文件生成对应的目标文件时需要携带选项 fPIC-fPIC 作用于编译阶段告诉编译器产生与位置无关代码Position-Independent Code而产生的代码中没有绝对地址全部使用相对地址因此代码可以被加载器加载到内存的任意位置都可以正确的执行。则共享库被加载时在内存的位置不是固定的。 gcc -fPIC -c Print.c -o Print_so.c -stdc99 gcc -fPIC -c Print.c2、使用 -shared 选项将所有目标文件打包为动态库 -shared 生成一个共享对象该对象可以与其它对象链接以形成可执行文件 gcc -shared -o libcalc.so Print_so.o calc_so.o3、将头文件和生成的动态库组织起来 创建一个目录 lib_dyl 在该目录下创建 include 和 lib 目录将 calc.h 和 Print.h 这两个头文件放到 include 目录下将生成的动态库文件 libcalc.so 放到 lib 目录下然后就可以将 lib_dyl 给别人用了。 使用 makefile 将以上步骤组织起来形成 makefile 文件。 libmath.so:calc_so.o Print_so.ogcc -shared -o libcalc.so calc_so.o Print_so.o calc_so.o:calc.cgcc -fPIC -c calc.c -o calc_so.o -stdc99 Print_so.o:Print.cgcc -fPIC -c Print.c -o Print_so.o -stdc99 .PHONY:output output:mkdir -p lib_dyl/lib mkdir -p lib_dyl/includecp *.so lib_dyl/lib cp *.h lib_dyl/include.PHONY:clean clean:rm -rf *.o *.so lib_dyl写好 makefile 以后我们就可以将动态库进行一键发布。首先使用 make 生成所有目标文件对应的源文件然后 make output 将这些目标文件与动态库文件组织起来 使用 我们将动态库和测试代码拷贝到一个新的目录接下来进行测试 引用动态库编译成可执行文件与静态库的方式一样在使用动态库时也需要加路径也需要使用 -l、-I、-L 这三个选项来生成可执行文件。 接下来运行./test 发现竟然报错了生成的可执行程序不能正常运行。 那么猜测可能的原因是因为动态库与测试程序不在同一个目录下接下来进行验证 经过测试后发现动态库可以正常链接可执行程序执行成功但是在实际中动态库一般不会和我们自己的可执行在同一路径下。因此该方法不实用。 这里需要注意一下使用 -I、-l、-L 选项是让编译器能够找到我们使用的头文件和库文件所在位置但是使用 gcc/g 生成可执行程序后生成的可执行程序就和编译器没有关系了。当可执行程序运行时依旧找不到该可执行程序所依赖的库。 下面将介绍四种方法来解决此问题。 1️⃣ 拷贝 .so 文件到系统共享库路径下一般指 /usr/bin不推荐此做法拷贝库文件到系统库路径下会污染库 sudo cp lib_dyl/include/* /usr/include/ sudo cp lib_dyl/lib/* /lib64/上面只是一个演示若不想将自己的库文件留着系统的库文件中可以将它进行删除。 2️⃣更改 LD_LIBRARY_PATH配置完成之后退出之后再次查看 LD_LIBRARY_PATH 是 Linux 系统下的环境变量名类似于 PATH。它用于指定查找共享库动态链接库时除了默认路径./lib 和 ./usr/lib之外的其它路径。 使用场景移植程序时经常需要使用一些特定的动态库而这些编译好的动态库放在自己建立的目录中这时可以将这些目录设置到 LD_LIBRARY_PATH 中。 在 Linux 下可以使用 export 命令来设置这个值 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/home/hyr/linux_code/linux17/uselib_dyl/lib_dyl/libexport 导入变量后在重启时会失效。可以在 ~/.bashrc 或者 ~/.bash_profile 中添加 export 语句前者在每次登录和每次打开 shell 都会读取一次后者只在登陆时读取一次。 例如在 ~/.bashrc 文件末尾添加我们动态库所在的路径如下所示 在添加保存之后需要关闭当前的终端并重新打开一个新的终端从而使上面的配置失效。 3️⃣ 配置 /etc/ld.so.conf.d/配置完成之后使用 ldconfig 更新使配置生效 可以通过配置 /etc/ld.so.conf.d/ 来解决此问题该路径下存储的全是以 .conf 为后缀的文件。这些文件中存储的都是一些路径系统会自动在该路径下查找所有配置文件里面的路径然后在每一个路径下查找是否有你需要的库若查找到了则你的程序可以正确的链接到动态库了。 以下演示一下操作 4️⃣使用软链接将路径指向库 我们使用自己创建的动态链接与系统库建立软链接这样就可以使可执行程序正确链接了 可以使用 unlink 来取消软链接关系如下所示
http://www.hkea.cn/news/14480469/

相关文章:

  • 如何利用网站模板做网站技智网站建设小编
  • 单页网站设计中国百强企业
  • 门户网站改版搬搬屋源码网
  • 外国网站的浏览器下载黑龙江网站建设
  • 在手机上如何制作网站舆情监测
  • 网络公司网站建设方案淘宝app官网
  • 佛山网站哪家最专业怎么制作小程序
  • 中山手机网站开发怎么做化妆品网站内容规划
  • 哪个网站可以找设计师做设计师龙岗建设工程交易中心官网
  • 如何用wordpress搭建网站手机网站系统
  • 网站建设与维护典型案例怎么做网站流量统计分析
  • 购物网站开发教案做网站公司那家好
  • 网站建设的指导书单页站好做seo吗
  • wordpress nginx apacheasp系统网站怎么做优化
  • 专业做网站和小程序平面设计创意广告
  • 网站备案申请流程做项目挣钱的网站
  • 做设计用哪个素材网站自助建站系统注册
  • 建站公司还赚钱吗河东集团网站建设
  • 滁州网站建设推广网站开发主要职责
  • 网站简繁体转换代码网站管理与维护方案
  • 永州网站建设包括哪些wordpress安装引导页
  • 购物网站页面布局gps建站步骤
  • 寻甸马铃薯建设网站wordpress数据库thinkphp
  • 淘宝网站是怎么做的吗win10 wordpress安装教程
  • 网页制作工具的英文名单页关键词优化费用
  • 网站图片放大特效怎么做龙溪网站制作
  • 国外做电商网站有哪些方面wordpress边栏浮动
  • 网站建设好后怎么制作网页wordpress 推荐版本
  • 想学做网站seo 在哪学 电话多少使用flashfxp上传网站
  • 遂宁市建设局网站四川省建十一公司官网