Я совершенно новичок в 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 functions
в библиотеке, а не методы члена C ++.my_app
должен быть в состоянии позвонить func()
без каких-либо другихЕстественно, каждая библиотека содержит разные искаженные символы C ++, и я не могу создать один extern "C"
пункт, который работает для всех (например):
Единственный способ, который приходит мне в голову — это получить список символов библиотеки, найти func
подстрока (которая противна и подвержена ошибкам) и сформулировать extern "C"
предложение с использованием макросов.
Можете ли вы предложить лучшее решение?
Вы не можете загрузить функцию без указания ее пространства имен (кроме как в глобальном пространстве имен).
Пространство имен является частью имени функции (поскольку его объявили в этой области). Для того, чтобы использовать его, вам придется использовать с помощью ключевое слово или полное имя функции (например, Пространство имен :: 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)
,