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

企业做网站的费用如果做账推广文章的注意事项

企业做网站的费用如果做账,推广文章的注意事项,外贸网络推广信,道路建设去什么网站能看到共享库是将库函数打包成一个可执行文件,使得其在运行时可以被多个进程共享。 目标库 回顾下构建程序的一种方式: 将每个源文件编译成目标文件,再通过链接器将这些目标文件链接组成一个可执行程序。 gcc -g -c prog.c mod1.c mod2.c gcc -g …

共享库是将库函数打包成一个可执行文件,使得其在运行时可以被多个进程共享。

目标库

回顾下构建程序的一种方式:

将每个源文件编译成目标文件,再通过链接器将这些目标文件链接组成一个可执行程序。

gcc -g -c prog.c mod1.c mod2.c
gcc -g -o prog prog.o mod1.o mod2.o

库分为静态的和共享的

静态库

静态库是一个保存所有被添加到其中的目标文件的副本的文件。其名称形式libname.a

可以通过ar命令来创建和维护静态库

ar options archive object-files ...
#比如创建静态库
ar r libtest.a test1.o test2.o test3.o
#比如从静态库中删除一个模块
ar d libtest.a test2.o

使用静态库有两种方法

  • gcc -g -o prog prog.o libtest.a

  • gcc -g -o prog prog.o -Lxxx -ltest, 通过-L执行搜索目录和-l指定库名称

创建共享库

静态库有一些缺陷:

  • 多个静态库如果都使用到同一个目标文件,那么存储同一个目标文件的多个副本将会浪费磁盘空间

  • 如果多个程序都使用到了这个同一个目标文件,那么每个程序会在虚拟内存中独立保存一份该目标文件的副本,提高了整体虚拟内存使用量

  • 如果这同一个目标文件修改了, 那么使用到这个目标文件的多个静态库都要重新链接

所以,需要设计出共享库机制。

共享库的目标思想是目标文件的单个副本由所有需要使用它的程序共享

由第一个需要使用该目标文件的程序启动时,将该目标文件的副本运行加载进内存,后面的程序如果也需要使用该目标文件,直接使用已经被加载进内存的副本即可。

虽然共享库的代码是共享的,但其中的变量不是共享的,每个使用库的程序会拥有自己在库中定义的全局和静态变量的副本。

创建一个共享库

gcc -g -c -fPIC -Wall mod1.c mod2.c mod3.c
gcc -g -shared -o libfoo.so mod1.o mod2.o mod3.o

共享库的前缀是lib,后缀是.so

-fPIC选项:编译器应该生成位置独立的代码,这样共享库代码可以放到任意一个虚拟地址处。

也可以使用一行命令来生成共享库

gcc -g -fPIC -Wall mod1.c mod2.c mod3.c -shared -o libfoo.so

使用共享库也有两种方法

  • gcc -g -o prog prog.o libfoo.so

  • gcc -g -o prog prog.o -Lxxx -lfoo, 通过-L执行搜索目录和-l指定库名称

程序启动时可以通过LD_LIBRARY_PATH来指定库的位置。

共享库别名soname

如果一个共享库有别名soname,则静态链接时会将soname嵌入到可执行文件中,而不使用真实名字。

gcc -g -c -fPIC -Wall mod1.c mod2.c mod3.c
gcc -g -shared -Wl,-soname,libbar.so -o libfoo.so mod1.o mod2.o mod3.o

通过**-Wl,-soname**参数设置共享库libfoo.so的别名为libbar.so,这样程序在链接共享库libfoo.so的时候嵌入的就是libbar.so名字,所以还需要一步,创建软连接:

ln -s libfoo.so libbar.so

请添加图片描述

soname的目的是为了提供一层间接层,使得可执行程序能够在运行时使用与链接时使用的库不同的(但兼容的)共享库

版本和命名

真实名字命名规则

libname.so.major-id.minor-id,比如libdemo.so.1.0.1,第一个数字是主版本号,第二个数字是次版本号,第三个数字是该次版本中的修订号或补订号

soname命名规则

libname.so.major-id,比如libdemo.so.1,只需要包含主版本号。

libname.so.1 --> libdemo.so.1.0.1

通常还会创建一个链接器名称,比如libdemo.so,没有版本号。链接器铭名称可以链接到soname也可以链接到真实名字,一般链接到soname。

libname.so --> libname.so.1
libname.so.1 --> libname.so.1.0.1

请添加图片描述

动态加载库

在linux中可以通过dlopen API组来打开使用共享库。

构建程序时必须使用-ldl选项链接libdl库

主要的函数有dlopen(), dlsym(), dlclose(), dlerror()等:

#include <dlfcn.h>
void *dlopen(const char *filename, int flags); //打开共享库
void *dlsym(void *handle, const char *symbol); //查找符号
int dlclose(void *handle);    //关闭共享库
char *dlerror(void);        //错误诊断

控制符号可见性

如果共享库中的某个函数不想被导出symbol给外部访问,可以怎么做?

  • C程序中可以使用static关键词使得函数符号私有

  • gcc编译器提供了一个声明特性,与static效果类似

    void __attribute__((visibility("hidden"))) fun(void) { }
    

LD_PRELOAD

LD_PRELOAD环境变量的设置可以使得程序预加载指定的库,或者通过文件**/etc/ld.so.preload**来控制预加载库也是一样的。

LD_DEBUG

LD_DEBUG环境变量可以帮助监控动态链接器到底在搜索那些库,比如

LD_DEBUG=libs xxx可以监控程序xxx执行时搜索的库的路径。

代码实例

源码参考share_lib文件夹

testfun.c

#include <stdio.h>
void testfun(void) {printf("this is testfun\n");
}

dyload.c

#include <dlfcn.h>
#include <stdio.h>
#include <string.h>int main(int argc, char *argv[])
{void *libHandle;void (*funcp)(void);const char *err;if (argc != 3 || strcmp(argv[1], "--help") == 0) {printf("usage: %s <lib-path> <func-name>\n", argv[0]);return 0;}libHandle = dlopen(argv[1], RTLD_LAZY);if (libHandle == NULL) {printf("dlopen: %s", dlerror());return -1;}(void) dlerror();*(void **)&funcp = dlsym(libHandle, argv[2]);err = dlerror();if (err) {printf("dlsym: %s\n", err); return -1;}if (!funcp) {printf("%s is NULL\n", argv[2]);return -1;}else {printf("%s addr is: %p\n", argv[2], funcp);}(*funcp)();dlclose(libHandle);return 0;
}

Makefile

src1:=dyload.c
obj1:=dyload
src2:=testfun.c
obj2:=libtestfun.soall:${src1} ${src2}gcc -g -fPIC -Wall ${src2} -shared -o ${obj2}gcc -g -o ${obj1} ${src1}./${obj1} ./${obj2} testfunclean:@rm ${obj1} ${obj2}

执行效果,dyload执行时打印出libtestfun.so中testfun函数的地址,并执行该函数。

root@pc:share_lib# make
gcc -g -fPIC -Wall testfun.c -shared -o libtestfun.so
gcc -g -o dyload dyload.c
./dyload ./libtestfun.so testfun
testfun addr is: 0x7f694b0f8119
this is testfun

参考文献

《linux programming interface》part42-43

http://www.hkea.cn/news/116635/

相关文章:

  • 中小型网站建设服务淘宝数据分析工具
  • 梧州网站设计企业网站模板建站
  • 行政事业单位网站建设建议营销策划公司
  • 网络推广网站怎么做百度联盟广告点击一次收益
  • wordpress居中样式宁波seo网络推广外包报价
  • java做网站用到哪些技术网络营销的重要性与意义
  • 网络营销推广的作用谷歌seo什么意思
  • 免费网站建设解决方案郑州网络营销公司哪个好
  • 转转怎么做钓鱼网站税收大数据
  • 株洲专业网站排名优化深圳产品网络推广
  • 深圳美食教学网站制作如何免费搭建自己的网站
  • 兰州移动端网站建设广东整治互联网霸王条款
  • 彩票网站该怎么建设天津seo实战培训
  • 原平的旅游网站怎么做的新冠疫情最新情况最新消息
  • 网站开发软件著作权归谁seo外包
  • 小说网站的网编具体做哪些工作南宁网站快速排名提升
  • 承德网站设计seo互联网营销培训
  • 工信部网站备案查询 手机seo专员的工作内容
  • 淘宝活动策划网站视频营销成功的案例
  • 精准营销数据杭州排名优化软件
  • 中卫网站建站设计seo学习论坛
  • wordpress初始登录seo排名赚app靠谱吗
  • 软件外包保密协议seo相关岗位
  • 后台网站开发文档下载班级优化大师app
  • 辛集城乡建设管理局网站网络营销网络推广
  • 阿里云部署一个自己做的网站吗电商网站搭建
  • 免费汽车租赁网站模板网站域名解析ip查询
  • 企业解决方案官网国内seo排名分析主要针对百度
  • 变态版手游石景山区百科seo
  • 阿里云控制台登录入口seo矩阵培训