Что вы имеете в виду? Инициализировать и закрыть библиотеку по мере появления-исчезновения объектов? Вот мой код (работает с cURL, но понятно).
В чём его смысл? Как только объект cURL требуется первый раз, инициализируем глобальный объект. Теперь, скорее всего, cURL будет разрушен с его деструктором. Но если в каком-то потоке объект cURL будет слишком долго жить — ничего, подождём.
(Внимание, тут гонка, если одновременно потребуются два объекта cURL. Нам такое не нужно, но если вдруг — защитите по принципу Singleton’а.)
namespace curl {
std::atomic<size_t> nLib(0);
class _Lib
{
public:
bool isIn = false;
~_Lib();
};
_Lib lib;
void addLib()
{
int q = ++nLib;
if (q == 1) {
lib.isIn = true;
q = ++nLib;
curl_global_init(CURL_GLOBAL_ALL);
}
//std::cout << "Added lib, now " << q << std::endl;
}
void releaseLib()
{
int q = --nLib;
if (q == 0) {
//std::cout << "Cleaned up lib" << std::endl;
curl_global_cleanup();
} else {
//std::cout << "Released lib, now " << q << std::endl;
}
}
_Lib::~_Lib()
{
if (isIn)
releaseLib();
}
}
curl::Curl::Curl()
{
addLib();
fData.handle = curl_easy_init();
}
curl::Curl::~Curl()
{
if (fData.handle)
curl_easy_cleanup(fData.handle);
releaseLib();
}