跨多个命名空间的动态加载
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++ 编写的,但我只是
谈论在库中调用一些
C functions
,而不是 C++ 成员方法。
- 相同的
my_app
应该可以调用 func()
而无需任何其他
参数提示。
当然,每个库都包含一个不同的损坏的 C++ 符号,我无法创建一个适用于所有人的单个 extern "C"
子句(例如):
- $^%X^&Y&^&Zfunc&^arg*&*
- $#$A#$B&^&C&^func*&arg^&^&
我想到的唯一方法是获取库符号列表,搜索 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)
.
我是 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++ 编写的,但我只是
谈论在库中调用一些
C functions
,而不是 C++ 成员方法。 - 相同的
my_app
应该可以调用func()
而无需任何其他 参数提示。
当然,每个库都包含一个不同的损坏的 C++ 符号,我无法创建一个适用于所有人的单个 extern "C"
子句(例如):
- $^%X^&Y&^&Zfunc&^arg*&*
- $#$A#$B&^&C&^func*&arg^&^&
我想到的唯一方法是获取库符号列表,搜索 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)
.