There is also dlsym and GetProcAddress, it doesn't need the header and can be simplified by a macro.
But I was not thinking of the possibility of distributing the header, why not, with this we don't need to do anything as the header can contain functions or class like the user wants, there is just the risk to use the header when the plugin is not loaded.