- Notifications
You must be signed in to change notification settings - Fork47
C++ cross-platform wrapper around dynamic loading of shared libraries (dll, so, dylib)
License
martin-olivier/dylib
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
The goal of this C++ library is to load dynamic libraries (.so, .dll, .dylib) and access its functions and global variables at runtime.
⭐ Don't forget to put a star if you like the project!
Works onLinux
,MacOS
andWindows
You can installdylib
fromvcpkg orconan center:
vcpkg install dylib
conan install --requires=dylib/2.2.1
You can also fetchdylib
to your project usingCMake
:
include(FetchContent)FetchContent_Declare( dylib GIT_REPOSITORY"https://github.com/martin-olivier/dylib" GIT_TAG"v2.2.1")FetchContent_MakeAvailable(dylib)
Thedylib
class can load a dynamic library from the system library path
// Load "foo" library from the system library pathdyliblib("foo");
Thedylib
class can also load a dynamic library from a specific path
// Load "foo" library from relative path "./libs"dyliblib("./libs","foo");// Load "foo" library from full path "/usr/lib"dyliblib("/usr/lib","foo");
Thedylib
class will automatically add the filename decorations of the current os to the library name, but you can disable that by settingdecorations
parameter todylib::no_filename_decorations
// Windows -> "foo.dll"// MacOS -> "libfoo.dylib"// Linux -> "libfoo.so"dyliblib("foo");// Windows -> "foo.lib"// MacOS -> "foo.lib"// Linux -> "foo.lib"dyliblib("foo.lib", dylib::no_filename_decorations);
get_function
Get a function from the dynamic library currently loaded in the object
get_variable
Get a global variable from the dynamic library currently loaded in the object
// Load "foo" dynamic librarydyliblib("foo");// Get the function "adder" (get_function<T> will return T*)auto adder = lib.get_function<double(double,double)>("adder");// Get the variable "pi_value" (get_variable<T> will return T&)doublepi = lib.get_variable<double>("pi_value");// Use the function "adder" with "pi_value"double result = adder(pi,pi);
has_symbol
Returns true if the symbol passed as parameter exists in the dynamic library, false otherwise
get_symbol
Get a symbol from the dynamic library currently loaded in the object
native_handle
Returns the dynamic library handle
dyliblib("foo");if (lib.has_symbol("GetModule") ==false) std::cerr <<"symbol 'GetModule' not found in 'foo' lib" << std::endl;dylib::native_handle_type handle = lib.native_handle();dylib::native_symbol_type symbol = lib.get_symbol("GetModule");assert(handle !=nullptr && symbol !=nullptr);assert(symbol == dlsym(handle,"GetModule"));
load_error
This exception is raised when the library failed to load or the library encountered symbol resolution issues
symbol_error
This exception is raised when the library failed to load a symbol
Those exceptions inherit fromdylib::exception
try { dyliblib("foo");double pi_value = lib.get_variable<double>("pi_value"); std::cout << pi_value << std::endl;}catch (const dylib::load_error &) { std::cerr <<"failed to load 'foo' library" << std::endl;}catch (const dylib::symbol_error &) { std::cerr <<"failed to get 'pi_value' symbol" << std::endl;}
A full example about the usage of thedylib
library is availableHERE
To build unit tests, enter the following commands:
cmake. -B build -DDYLIB_BUILD_TESTS=ONcmake --build build
To run unit tests, enter the following command insidebuild
directory:
ctest
If you have any question about the usage of the library, do not hesitate to open adiscussion
If you want to report a bug or provide a feature, do not hesitate to open anissue or submit apull request
Set the cmake flagDYLIB_BUILD_TESTS
toON
to enable tests and make it easier for you to contribute
cmake. -B build -DDYLIB_BUILD_TESTS=ON
Do not forget to sign your commits and useconventional commits when providing a pull request
git commit -s -m"feat: ..."
About
C++ cross-platform wrapper around dynamic loading of shared libraries (dll, so, dylib)