gpt4 book ai didi

c++ - 与 dlopen/dlsym 一起使用时 dynamic_cast 失败

转载 作者:IT老高 更新时间:2023-10-28 21:41:55 27 4
gpt4 key购买 nike

简介

让我为这个冗长的问题提前道歉。它尽可能短,不幸的是,它不是很短。

设置

我定义了两个接口(interface),A和B:

class A // An interface
{
public:
virtual ~A() {}

virtual void whatever_A()=0;
};

class B // Another interface
{
public:
virtual ~B() {}

virtual void whatever_B()=0;
};

然后,我有一个共享库“testc”,它构造 C 类的对象,实现 A 和 B,然后传递指向它们的 A 接口(interface)的指针:

class C: public A, public B
{
public:
C();
~C();

virtual void whatever_A();
virtual void whatever_B();
};

A* create()
{
return new C();
}

最后,我有第二个共享库“testd”,它以 A* 作为输入,并尝试使用 将其转换为 B* >dynamic_cast

void process(A* a)
{
B* b = dynamic_cast<B*>(a);
if(b)
b->whatever_B();
else
printf("Failed!\n");
}

最后,我有了主应用程序,在库之间传递 A*:

A* a = create();
process(a);

问题

如果我构建我的主应用程序,链接到“testc”和“testd”库,一切都会按预期工作。但是,如果我将主应用程序修改为不链接到“testc”和“testd”,而是在运行时使用 dlopen/dlsym 加载它们,那么 dynamic_cast 失败。

我不明白为什么。有什么线索吗?

其他信息

  • 使用 gcc 4.4.1、libc6 2.10.1 (Ubuntu 9.10) 测试
  • Example code可用

最佳答案

我找到了问题的答案 here .据我了解,我需要将“testc”中的类型信息提供给“testd”库。要在使用 dlopen() 时做到这一点,需要做两件事:

  • 链接库时,将 -E 选项传递给链接器,以确保它将所有符号导出到可执行文件,而不仅仅是其中未解析的符号(因为没有)
  • 使用 dlopen() 加载库时,添加 RTLD_GLOBAL 选项,以确保 testc 导出的符号也可用于 已测试

关于c++ - 与 dlopen/dlsym 一起使用时 dynamic_cast 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2351786/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com