- Notifications
You must be signed in to change notification settings - Fork46
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(dylibGIT_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&)double pi = 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)
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Uh oh!
There was an error while loading.Please reload this page.
Contributors10
Uh oh!
There was an error while loading.Please reload this page.