2

我完全是新手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"使用宏制定子句。你能建议一个更好的解决方案吗?

4

1 回答 1

4

如果不指定其命名空间(除非在全局命名空间中),则无法加载函数。

命名空间是函数名称的一部分(因为它是在该范围内声明的)。为了使用它,您必须使用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).

于 2015-05-18T12:26:48.347 回答