首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Android的dlopen

基于Android的dlopen
EN

Stack Overflow用户
提问于 2013-12-17 18:17:15
回答 1查看 1.7K关注 0票数 2

我制作了一个c++主应用程序,它加载了一个也由我制作的so库。这两个源共享一个共同的头(TestFlags.h)。在TestFlags.h中,我有一个类和一个指针声明,它的目的是对整个应用程序是全局的,即在主应用程序中定义一个实例,并在库函数中使用它。

代码语言:javascript
复制
class TestFlags {
public:
    TestFlags() : behaviour(1)
        {}
    int behaviour;
};

extern __attribute__ ((visibility("default"))) TestFlags * gpTestFlags;

然后,为达到指定目标而遵循的一系列执行步骤如下:

  1. 主应用程序创建TestFlags的新实例-> gpTestFlags =新的TestFlags();
  2. 主要应用程序加载库-> dlopen(library.so,RTLD_LAZY|RTLD_GLOBAL)
  3. 调用一个驻留在库中的函数,它使用先前声明的实例-> gpTestFlags->behaviour = 2;
  4. 接收SIGSEGV:分割错误,因为gpTestFlags为NULL

似乎由于某种原因,在库中看不到gpTestFlags实例。我拥有的其他静态类也会发生同样的情况,这些值是在库中未见的主应用程序上配置的。

据我所知,这个库似乎为那些声明管理着一个完全不同的内存空间,比如它是否被复制。

EN

回答 1

Stack Overflow用户

发布于 2013-12-17 19:10:25

这是dlopen()预期的工作方式。

这两个模块具有独立的全局符号gpTestFlags。如果你试着把它们连接在一起,链接器就会对重复的链接尖叫。

可以将库中的指针声明为弱指针,也可以使用dlsym()以编程方式解析链接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20641730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档