LSSTApplications  19.0.0-14-gb0260a2+72efe9b372,20.0.0+7927753e06,20.0.0+8829bf0056,20.0.0+995114c5d2,20.0.0+b6f4b2abd1,20.0.0+bddc4f4cbe,20.0.0-1-g253301a+8829bf0056,20.0.0-1-g2b7511a+0d71a2d77f,20.0.0-1-g5b95a8c+7461dd0434,20.0.0-12-g321c96ea+23efe4bbff,20.0.0-16-gfab17e72e+fdf35455f6,20.0.0-2-g0070d88+ba3ffc8f0b,20.0.0-2-g4dae9ad+ee58a624b3,20.0.0-2-g61b8584+5d3db074ba,20.0.0-2-gb780d76+d529cf1a41,20.0.0-2-ged6426c+226a441f5f,20.0.0-2-gf072044+8829bf0056,20.0.0-2-gf1f7952+ee58a624b3,20.0.0-20-geae50cf+e37fec0aee,20.0.0-25-g3dcad98+544a109665,20.0.0-25-g5eafb0f+ee58a624b3,20.0.0-27-g64178ef+f1f297b00a,20.0.0-3-g4cc78c6+e0676b0dc8,20.0.0-3-g8f21e14+4fd2c12c9a,20.0.0-3-gbd60e8c+187b78b4b8,20.0.0-3-gbecbe05+48431fa087,20.0.0-38-ge4adf513+a12e1f8e37,20.0.0-4-g97dc21a+544a109665,20.0.0-4-gb4befbc+087873070b,20.0.0-4-gf910f65+5d3db074ba,20.0.0-5-gdfe0fee+199202a608,20.0.0-5-gfbfe500+d529cf1a41,20.0.0-6-g64f541c+d529cf1a41,20.0.0-6-g9a5b7a1+a1cd37312e,20.0.0-68-ga3f3dda+5fca18c6a4,20.0.0-9-g4aef684+e18322736b,w.2020.45
LSSTDataManagementBasePackage
library.h
Go to the documentation of this file.
1 #ifndef LSST_BASE_LIBRARY_H
2 #define LSST_BASE_LIBRARY_H
3 
4 #include <stdexcept>
5 #include <string>
6 
7 #include <dlfcn.h>
8 #ifndef RTLD_DEEPBIND // Non-POSIX flag, so it may not exist
9 #define RTLD_DEEPBIND 0 // Will be ignored
10 #endif
11 
12 namespace lsst {
13 namespace base {
14 
17 public:
19  std::runtime_error("Unable to dynamically load library " + name) {};
20  LibraryException(std::string const& lib, std::string const& func) :
21  std::runtime_error("Unable to find function " + func + " from dynamically loaded library " + lib) {};
22 };
23 
28 
34 
39 bool canLoadLibrary(
40  std::string const& libName
41  );
42 
43 
50 template <typename T>
52  std::string const& libName,
53  std::string const& symName
54  )
55 {
56  void* lib = dlopen(getLibraryFilename(libName).c_str(), RTLD_LAZY | RTLD_DEEPBIND);
57  if (!lib) {
58  throw LibraryException(libName);
59  }
60 
61  T* sym;
62  (void*&)sym = dlsym(lib, symName.c_str());
63  if (!sym) {
64  throw LibraryException(libName, symName);
65  }
66  return sym;
67 }
68 
69 }} // lsst::base
70 
71 
72 #endif
std::string
STL class.
lsst::base::getLibraryFilename
std::string getLibraryFilename(std::string const &name)
Get filename for library.
Definition: library.cc:27
lsst::base::loadSymbol
T * loadSymbol(std::string const &libName, std::string const &symName)
Load a symbol from a dynamic library.
Definition: library.h:51
lsst::base::LibraryException::LibraryException
LibraryException(std::string const &lib, std::string const &func)
Definition: library.h:20
lsst::afw::geom.transform.transformContinued.name
string name
Definition: transformContinued.py:32
RTLD_DEEPBIND
#define RTLD_DEEPBIND
Definition: library.h:9
std::string::c_str
T c_str(T... args)
lsst::base::libraryExtension
std::string libraryExtension()
Return filename extension for libraries.
Definition: library.cc:17
std::runtime_error
STL class.
lsst
A base class for image defects.
Definition: imageAlgorithm.dox:1
lsst::base::canLoadLibrary
bool canLoadLibrary(std::string const &libName)
Return whether we can load a library.
Definition: library.cc:37
std
STL namespace.
lsst::base::LibraryException
Unable to load library.
Definition: library.h:16
lsst::base::LibraryException::LibraryException
LibraryException(std::string const &name)
Definition: library.h:18