跨多个命名空间的动态加载

dynamic loading across multiple namespaces

我是 dlsym 的新手,我刚刚回顾了 C++ dlopen mini HOWTO。所以如果我的概念和方法有误,请纠正我:

我打算编写一个将 shared library 个名称作为参数的应用程序:

./my_app libXYZ.so

不同的输入库使用它们自己的 namespaces 来声明恰好具有相似签名的函数:

libXXX.so:

namespace X {
namespace Y {
namespace Z{

 ret_t func(arg_r);

}}}

libABC.so:

namespace A {
namespace B {
namespace C{

 ret_t func(arg_r);

}}}

当然,每个库都包含一个不同的损坏的 C++ 符号,我无法创建一个适用于所有人的单个 extern "C" 子句(例如):

我想到的唯一方法是获取库符号列表,搜索 func 子字符串(这是令人讨厌且容易出错的)并使用 extern "C" 子句宏。 您能提出更好的解决方案吗?

您不能在不指定其名称空间的情况下加载函数(除非在全局名称空间中)。

命名空间是函数名称的一部分(since its declared in that scope). In order to use it, you will have to use the using关键字或函数的全名(例如namespace::some_function)。

但是,如果您想要以统一的方式调用此类函数,则可以为所有库创建一个通用接口。

namespace A {
namespace B {
namespace C{

 ret_t func(arg_r);

}}}

extern "C" {
    ret_t call_func(arg_r)
    {
         return A::B::C::func(arg_r);
    }
}

另一个图书馆也一样。因此,在您的库的客户端代码中,您只调用 call_func(arg_r).