Import Functions
Learn how to import functions from other plugins written in different languages and use them in your own.
To use functions from another plugin in your C++ plugin, you need to generate language-specific header files. These headers provide the necessary wrappers to call functions exported by other plugins. This guide explains how to generate these headers and how to use them in your C++ plugin.
Generating Header Files
Plugify provides a unified generator tool to automatically generate header files for importing functions from other plugins. These headers include wrapper functions that handle the function calls and parameter passing.
Steps to Generate Bindings
Using the Online Generator:
Visit plugify-gen tool to generate bindings through a user-friendly web interface. Simply upload your plugin manifest file (.pplugin) and select C++ as the target language to generate the corresponding module.
Using the Command-Line Tool:
You can also download and use the generator tool locally from the plugify-gen repository.
Example usage:
Integrate the Generated Module:
- The tool generates the folder
external/plugify/include/plugin_from_another_language/in the specified output directory. It holds the headers and one source file,plugin_from_another_language.cpp, that defines the function pointers. - Copy the generated folder into your project.
- Add its parent folder to your include paths and the
.cppfile to your sources. - Declare the plugin in the
dependenciesof your manifest, so that it loads before yours.
Project Integration
After generating the module, integrate it into your C++ project:
Copy Module to Project
Copy the generated folder into your project:
Update CMakeLists.txt
Add the include path and the generated source file:
Include in Source Files
Include the generated header in your source files:
Using Generated Wrapper Functions
The generated module contains wrapper functions that allow you to call functions from the other plugin. These wrappers handle the function address lookup and parameter passing.
Example Generated Header
Here’s an example of a generated header file for a plugin named plugin_from_another_language:
How It Works
plugin_from_another_language.cppdefines the pointer__plugin_from_another_language_ParamCallback, initiallynullptr.- When your plugin loads, the C++ language module finds this exported pointer in your library and writes the address of the exported function into it.
- The wrapper function (
ParamCallback) calls through the pointer, passing the parameters directly. - If your build uses a version script with
local: *;, add__plugin_from_another_language_*;underglobal:. Otherwise the module cannot see the pointer, it staysnullptr, and the first call crashes.
Example: Using the Generated Header
Here’s how you can use the generated header in your C++ plugin:
When is Header Generation Necessary?
In C++, you need generated headers for every plugin you import, whatever language that plugin is written in. Without them, the compiler cannot reference the exported functions. Plugins written in dynamically-typed languages like Python do not need this step, because method binding happens at runtime.
Best Practices
- Use the Generator Tool: Always use the Plugify generator tool (online or command-line) to generate headers for imported functions.
- Include Generated Headers: Include the generated headers in your plugin source files to access the exported functions.
- Test Thoroughly: Test the imported functions to ensure they work as expected.
- Document Dependencies: Clearly document the plugins and functions your plugin depends on.
Conclusion
Importing functions from another plugin in C++ is straightforward when you use the Plugify generator tool to generate the necessary headers. These headers provide wrapper functions that handle function address lookup and parameter passing, making it easy to integrate functionality from other plugins. By following the steps and best practices outlined in this guide, you can create robust and interoperable plugins in the Plugify ecosystem.