Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Is there any way to load a library dynamically?



  • Hi, I use Qt 4.7 on a Mac. I created several custom widgets. These widgets are compiled into a .dylib file installed in designer's plugin directory. When I open the designer in the Qt Creator, the .dylib is loaded. So I can use my widgets in my .ui file without any problem. Now I want to create different versions of the widgets/.dylib for different projects. And I want to load the right version of the .dylib for a specific project. Is there any way to achieve this?

    Thanks!


  • Moderators

    If you mean loading DLLs at runtime, you need to use QLibrary.



  • [quote author="sierdzio" date="1376111760"]If you mean loading DLLs at runtime, you need to use QLibrary.[/quote]

    AFAIK, this only works with "plain C" functions, but not with C++ objects. I never managed to load C++ objects dynamically (at runtime) from a DLL. It requires linking against the DLL via import library (.LIB file), I think.

    One workaround is to export some wrapper functions from the DLL:
    @#include "MyClass.h"

    extern "C"
    {
    __declspec(dllexport) MyClass* __cdecl newObject(void)
    {
    return new MyClass();
    }
    __declspec(dllexport) int __cdecl useObject(MyClass *o)
    {
    return o->doSomethingInteresting();
    }
    __declspec(dllexport) void __cdecl delObject(MyClass *o)
    {
    delete o;
    }
    }@

    Then use like this in the EXE file:
    @class MyClass;

    extern "C"
    {
    typedef MyClass* (*NewObjetFunc)(void);
    typedef int (UseObjetFunc)(MyClass);
    typedef void (DelObjetFunc)(MyClass);
    }

    NewObjectFunc newObjectPtr = NULL;
    UseObjectFunc useObjectPtr = NULL;
    DelObjectFunc delObjectPtr = NULL;

    QLibrary myLib("MyLibrary.dll")
    if(myLib.load())
    {
    newObjectPtr = (NewObjectFunc) myLib.resolve("newObject");
    useObjectPtr = (UseObjectFunc) myLib.resolve("useObject");
    delObjectPtr = (DelObjectFunc) myLib.resolve("delObject");
    }

    if(newObjectPtr && useObjectPtr && delObjectPtr)
    {
    MyClass *obj = newObjectPtr();

    int result = useObjectPtr(obj); //Actually use object here!
    
    delObjectPtr(obj);
    obj = NULL;
    

    }@


  • Moderators

    QLibrary is - as MuldeR said - for C functions resolving.
    You can use QPlugInLoader for loading C++ functions, but only when they are using "Qt plugin mechanismns":http://qt-project.org/doc/qt-5.0/qtcore/plugins-howto.html. Or link to them dynamically.

    Please note that for C++ symbol resolving the various things (e.g., compiler version, build mode, etc.) need to match in order to load a plugin successfully.



  • Thanks for all the help. I will try to see which method is proper to my case.


Log in to reply