Example

The following are 3 files you can use to create this example (see tar ball attachment below.) The original code comes from Aaron Isotton, although his example was not a true C++ sample... it would not use a global variable to auto-register the plug-in. Instead he would load a symbol. It is licensed under the GPL.

The first one (main.cpp) includes the code used to load and unload the plugin.

#include <iostream>
#include <dlfcn.h>

int main() {
    std::cout << "C++ dlopen demo" << std::endl << std::endl;

    // open the library
    std::cout << "Opening plugin.so..." << std::endl;
    void* handle = dlopen("./plugin.so", RTLD_LAZY);

    if (!handle) {
        std::cerr << "Cannot open plugin: " << dlerror() << std::endl;
        return 1;
    }

    // close the plugin
    std::cout << "Closing plugin..." << std::endl;
    dlclose(handle);
    std::cout << "PlugIn closed..." << std::endl;

    return 0;
}

The second one (plugin.cpp) is a test module showing that a global C++ object will be created when loaded from a .so file.

#include <iostream>

class PlugIn
{
public:
    PlugIn() {
        std::cout << " - Loaded PlugIn!!!" << std::endl;
    }
    ~PlugIn() {
        std::cout << " - Destroying PlugIn..." << std::endl;
    }
};

// Global variable representing the plug-in
PlugIn plugin;

Finally, you need to compile and link all of that with the following Makefile;

cpp-module: main.cpp plugin.so
    $(CXX) $(CXXFLAGS) -o cpp-module main.cpp -ldl

plugin.so: plugin.cpp
    $(CXX) $(CXXFLAGS) -fPIC -shared -o plugin.so plugin.cpp

clean:
    rm -f cpp-module plugin.so

.PHONY: clean

Note that the plugin.so is created using the -shared flag and not linked in main.cpp. If you return before the dlopen(), you will never see the plugin.so messages printed.

An important note about the functionality: in our real version the C++ global variable has to be a factory and not the actual plug-in object. This is important to allow for proper allocation and registration. More or less, constructors cannot exactly do whatever they want.

AttachmentSize
cpp-module.tar_.gz13.07 KB

Snap! Websites
An Open Source CMS System in C++

Contact Us Directly