динамическая загрузка в нескольких пространствах имен

Я совершенно новичок в 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&^ Аг *&*
  • $ # $ A # $ B&^&С&^ * Функ&аг ^&^&

Единственный способ, который приходит мне в голову — это получить список символов библиотеки, найти func подстрока (которая противна и подвержена ошибкам) ​​и сформулировать extern "C" предложение с использованием макросов.
Можете ли вы предложить лучшее решение?

2

Решение

Вы не можете загрузить функцию без указания ее пространства имен (кроме как в глобальном пространстве имен).

Пространство имен является частью имени функции (поскольку его объявили в этой области). Для того, чтобы использовать его, вам придется использовать с помощью ключевое слово или полное имя функции (например, Пространство имен :: 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),

4

Другие решения


По вопросам рекламы [email protected]