8 #if defined(WIN32) && !defined(__CYGWIN__) 15 #if defined(__APPLE__) 17 #define RTLD_DEEPBIND 0 28 virtual std::string
LibName()
const = 0;
35 std::string mPathToLib;
36 std::string mAllocClassSymbol;
37 std::string mDeleteClassSymbol;
40 std::string pathToLib,
41 std::string allocClassSymbol =
"allocator",
42 std::string deleteClassSymbol =
"deleter"):
43 mPathToLib(
std::move(pathToLib)),
44 mAllocClassSymbol(
std::move(allocClassSymbol)),
45 mDeleteClassSymbol(
std::move(deleteClassSymbol)) {}
48 if (!(mHandle = LoadLibrary(mPathToLib.c_str()))) {
49 throw std::runtime_error(std::string{
"Cannot open and load "} + mPathToLib);
53 if (FreeLibrary(mHandle) == 0) {
54 throw std::runtime_error(std::string{
"Cannot close "} + mPathToLib);
58 using allocClass = T *(*)();
59 using deleteClass = void (*)(T *);
60 auto allocFunc =
reinterpret_cast<allocClass
>(GetProcAddress(mHandle, mAllocClassSymbol.c_str()));
61 auto deleteFunc =
reinterpret_cast<deleteClass
>(GetProcAddress(mHandle, mDeleteClassSymbol.c_str()));
62 if (!allocFunc || !deleteFunc) {
68 throw std::runtime_error(std::string{
"Cannot find allocator or deleter symbol in "} + mPathToLib);
70 return std::shared_ptr<T>(allocFunc(), [deleteFunc](T* p){deleteFunc(p);});
72 std::string
LibName()
const override {
78 class DLLoader:
public DLLoaderInterface<T> {
81 std::string mPathToLib;
82 std::string mAllocClassSymbol;
83 std::string mDeleteClassSymbol;
86 std::string pathToLib,
87 std::string allocClassSymbol =
"allocator",
88 std::string deleteClassSymbol =
"deleter"):
89 mPathToLib(
std::move(pathToLib)),
90 mAllocClassSymbol(
std::move(allocClassSymbol)),
91 mDeleteClassSymbol(
std::move(deleteClassSymbol)) {}
94 if (!(mHandle = dlopen(mPathToLib.c_str(), RTLD_NOW|RTLD_LAZY|RTLD_DEEPBIND))) {
95 throw std::runtime_error(std::string{dlerror()});
99 if (dlclose(mHandle) != 0) {
100 throw std::runtime_error(std::string{dlerror()});
104 using allocClass = T *(*)();
105 using deleteClass = void (*)(T *);
106 auto allocFunc =
reinterpret_cast<allocClass
>(dlsym(mHandle, mAllocClassSymbol.c_str()));
107 auto deleteFunc =
reinterpret_cast<deleteClass
>(dlsym(mHandle, mDeleteClassSymbol.c_str()));
108 if (!allocFunc || !deleteFunc) {
111 throw std::runtime_error(std::string{dlerror()});
115 throw std::runtime_error(std::string{dlerror()});
117 return std::shared_ptr<T>(allocFunc(), [deleteFunc](T* p){deleteFunc(p);});
std::string LibName() const override
virtual void DLCloseLib()=0
DLLoader(std::string pathToLib, std::string allocClassSymbol="allocator", std::string deleteClassSymbol="deleter")
std::shared_ptr< T > DLGetInstance() override
virtual ~DLLoaderInterface()=default
void DLCloseLib() override
virtual std::shared_ptr< T > DLGetInstance()=0
virtual std::string LibName() const =0
void DLOpenLib() override
virtual void DLOpenLib()=0