A quick start guide to creating a UNIX-style dynamic library that calls functions from main program like a platform API.
- Git
- CMake
- C/C++ compiler (tested on MSVC and LLVM/Clang)
Optional:
- Visual Studio Code
- Ninja
- CCache
- Windows SDK (Comes pre-installed when installing
MSVC
;LLVM/Clang
alone will need this installed separately) - ms-vscode.cmake-tools vscode extension
Either hit F5
in vscode after configuring a launch target in CMake Tools
, or issue the following commands in the project directory to try out the programs:
cmake -S . -B build && cmake --build build
bin\dltest
Unlike UNIX which only requires the symbols to be available before calling them like a platform API, the approach in Windows is hacky and restricted to the main program it explicitly links against - so the plugins cannot be used on different main programs.
The main program will produce an import library (.lib
) file by using CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
, it will set a module-definition (.def
) file output under the hood which will be used to generate the .lib
file for the plugin to link against.
While this demonstrates that it is possible to perform this UNIX-style library calling main program functions like a platform API, the proper way to share functions for library and main program is to move common code into another shared library where both will link against.
Do note that in Windows, it can still be compiled properly if the main program links against the common code as object/static library while the shared library links against the common code shared library, they will not share variable space, which will be different from expectations.