gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:47 26 4
gpt4 key购买 nike

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

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

./my_app libXYZ.so

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

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 函数,而不是 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)。为了使用它,您必须使用 using关键字或函数的全名(例如 namespace::some_function)。

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

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)

关于c++ - 跨多个命名空间的动态加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30302515/

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