我做了一个c ++主要应用程序,它加载了我自己编写的一个so库。
这两个源共享一个公共头(TestFlags.h)。
在TestFlags.h内部,我有一个类和它的指针声明,该类旨在对整个应用程序是全局的,即在主应用程序中定义一个实例,并在库函数中使用它。
class TestFlags {
public:
TestFlags() : behaviour(1)
{}
int behaviour;
};
extern __attribute__ ((visibility("default"))) TestFlags * gpTestFlags;
然后要达到指定目标的一系列执行步骤是:
主应用程序创建一个TestFlags的新实例---> gpTestFlags = new TestFlags();
主应用程序加载库---> dlopen(library.so,RTLD_LAZY | RTLD_GLOBAL)
调用驻留在库中的函数,该函数使用声明为---> gpTestFlags-> behaviour = 2的先前实例;
收到SIGSEGV:分段错误,因为gpTestFlags为NULL
似乎由于某种原因未在库gpTestFlags实例中看到该实例。
我拥有的其他静态类也发生相同的事情,这些值是在主应用程序中配置的,在库中看不到。
据我所研究,似乎该库为那些声明管理着完全不同的内存空间,就像它是重复的一样。
最佳答案
这是dlopen()起作用的预期方式。
这两个模块具有独立的全局符号,称为gpTestFlags。如果尝试将它们链接在一起,则链接器将对重复项发出尖叫。
您可以将库中的指针声明为弱指针,也可以使用dlsym()以编程方式解析链接。
关于android - Android NDK上的dlopen,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20641730/