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

天迈装饰网站建设项目/中国最好的网络营销公司

天迈装饰网站建设项目,中国最好的网络营销公司,外国公司做网站,网站地址格式文章目录 问题例子生成静态库libsingleton.a生成动态库libfirst.so控制动态的导出符号生成动态库libsecond.so生成可执行文件app问题 解决方法: 问题 在下面这个例子中,可执行程序app链接一个静态库libsingleton.a和两个动态库libfirst.so,l…

文章目录

      • 问题
      • 例子
        • 生成静态库libsingleton.a
        • 生成动态库libfirst.so
        • 控制动态的导出符号
        • 生成动态库libsecond.so
        • 生成可执行文件app
        • 问题
      • 解决方法:

问题

在下面这个例子中,可执行程序app链接一个静态库libsingleton.a和两个动态库libfirst.solibsecond.so

  • 静态库libsingleton.a是一个单例对象,在动态库libfirst.solibsecond.so中都被链接。
  • 可执行程序app链接静态库libsingleton.a,动态库libfirst.solibsecond.so

在动态库,可执行程序中都调用了单例对象singletonDoSomething方法,它将输出单例对象的地址。最终输出的结果是每个对象的地址都不相同。这显然不符合我们的预期。就好比原本有一个封装了日志功能的静态,被多个动态库链接使用,本意是都使用同一个日志全局对象输出日志,结果缺产生了多个日志对象,这显然是不符合业务需求的。
先看下这个例子:

例子

生成静态库libsingleton.a

class Singleton {
public:static Singleton* GetInstance();static void Release();
public:void DoSomething(void);
private:Singleton(){};~Singleton(){};
private:static Singleton* _instance;};
#include <iostream>
#include "singleton.h"
Singleton* Singleton::_instance = nullptr;Singleton* Singleton::GetInstance(void) {if (nullptr == _instance) {_instance = new Singleton();}return _instance;
}void Singleton::Release() {if (nullptr != _instance) {delete _instance;_instance = nullptr;}}void Singleton::DoSomething(void) {std::cout<<"singleton:"<<_instance<<std::endl;
}

单例类singleton,把它编译为一个静态库。

g++ -Wall -g -fPIC -c singleton.cpp -std=c++11
ar -rcs libsingleton.a singleton.o

生成动态库libfirst.so

#ifdef __cplusplus
extern "C"
{void firstshlibFunction(void);
}
#endif
#include <iostream>
#include "singleton.h"
#include "firstshlib.h"
#define FUNC_EXPORT __attribute__((visibility("default")))#ifdef __cplusplus
extern "C" {
void FUNC_EXPORT firstshlibFunction(void) {std::cout<<__FUNCTION__<<std::endl;Singleton::GetInstance()->DoSomething();
}void firshlibOtherFunction(void) {std::cout<<__FUNCTION__<<std::endl;
}
}
#endif //__cplusplus

控制动态的导出符号

导出符号控制脚本,传递给链接器:

{global:firstshlibFunction;local:*;
};

使libfirst.so只导出符号firstshlibFunction

g++ -Wall -g -fPIC -I…/staticLib -c firstshlib.cpp
g++ -shared firstshlib.o -L…/staticLib -lsingleton -Wl,–version-script=versionScript -Wl,-soname,libfirst.so.1 -o libfirst.so.1.0.0

通过nm libfirst.so | grep c++filt查看libfirst.so的导出符号,如下:

0000000000000aec t Singleton::DoSomething()
0000000000000a58 t Singleton::GetInstance()
0000000000000aa0 t Singleton::Release()
0000000000202068 b Singleton::_instance
0000000000000b9a t Singleton::Singleton()
0000000000000b9a t Singleton::Singleton()
0000000000000ba4 t Singleton::~Singleton()
0000000000000ba4 t Singleton::~Singleton()
0000000000000985 T firstshlibFunction

因为libfirst.so链接了静态库libsingleton.a,它会包含静态库中的所有符号,默认情况下这些静态库都会标示为导出符号,通过连接器脚本versionScript将这些静态库符号隐藏,只导出符号firstshlibFunction

生成动态库libsecond.so

#ifdef __cplusplus
extern "C"
{void secondshlibFunction(void);
}
#endif
#include <iostream>
#include "singleton.h"
#ifdef __cplusplus
extern "C"
{
void secondshlibFunction(void) {std::cout<<__FUNCTION__<<std::endl;Singleton::GetInstance()->DoSomething();
}
}
#endif

编译为动态库libsecond.so,它也依赖静态库libsingleton.a,只导出符号secondshlibFunction

g++ -Wall -g -I./staticLib -I./firstshlib -I./secondshlib -c main.cpp
g++ main.o -L./staticLib -lsingleton -L./firstshlib -lfirst -L./secondshlib -lsecond -Wl,-R./firstshlib -Wl,-R./secondshlib -o app

生成可执行文件app

#include <iostream>
#include "singleton.h"
#include "firstshlib.h"
#include "secondshlib.h"
int main(void) {firstshlibFunction();secondshlibFunction();Singleton::GetInstance()->DoSomething();
}

可执行程序app,它也依赖静态库libsingleton.a,并且链接libfirst.solibsecond.so

g++ -Wall -g -I./staticLib -I./firstshlib -I./secondshlib -c main.cpp
g++ main.o -L./staticLib -lsingleton -L./firstshlib -lfirst -L./secondshlib -lsecond -Wl,-R ./firstshlib -Wl,-R./secondshlib -o app

问题

执行app,输出如下,全局对象的地址各不同。

firstshlibFunction
singleton:0x24f9c20
secondshlibFunction
singleton:0x24f9c40
singleton:0x24f9c60

虽然在静态库中有全局的单例对象,但是**libfirst.so****libsecond.so****app**中各自有**singleton**符号,所以全局对象地址各不相同。
这是因为没有导出**singleton**符号,所以在最终生成可执行程序**app**时,静态库中的符号作为内部符号并没有参与链接。

解决方法:

解决这种问题的方法就是,在任意一个动态库中将静态库的符号导出即可,让这些符号参与可执行文件的链接。
最优雅的方法是将这种全局功能实现为一个动态库,而非静态库。

http://www.jmfq.cn/news/4907143.html

相关文章:

  • 做日本淘宝网站/搜狗关键词排名查询
  • 网站制作优势/推广渠道有哪些方式
  • 做seo_教你如何选择网站关键词/上海seo推广
  • 做网站腾讯云服务器吗/廊坊seo快速排名
  • 聊城做网站的公司精英/百度云网页版入口
  • 信阳住房和城乡建设局网站/市场营销推广
  • 做网站界面需要注意什么问题/赣州网站建设
  • 建设网站服务器/百度网盘客服电话24小时
  • 大型营销型网站建设/上海关键词排名提升
  • 建云购网站吗/关键词排名零芯互联排名
  • 网站推广策划方案范文/个人怎么注册自己的网站
  • 在线图片编辑源码/seo资源是什么意思
  • 哪些网站可以做相册视频/广州百度seo 网站推广
  • 网站直播怎样做/宁波网站seo诊断工具
  • 外贸婚纱网站 侵权/同城推广平台有哪些
  • 网站开发需要掌握的知识/佛山网络推广培训
  • 中国建设银行最新招聘信息网站/微信推广怎么弄
  • 剑灵代做装备网站/排名优化系统
  • 如何做单网页网站/就业seo好还是sem
  • 捕鱼游戏在哪做网站/外贸seo软件
  • 160 作者 网站建设/seo销售话术开场白
  • 微信建设网站找哪家/今日国际军事新闻头条
  • html5官方网站开发流程/广告投放的方式有哪些
  • 国内知名网站制作公司/宁波seo网络推广渠道介绍
  • 秦皇岛网站制作小程序开发/徐州做网站的公司
  • 自己给自己网站做推广/百度收录量
  • 网站空间域名续费/网址域名
  • 邹城哪个公司做网站好/百度推广竞价
  • 郑州定制网站建设/网络平台宣传方式有哪些
  • 织梦个人网站模板/百度seo咋做