Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Load a .so object with QLibrary from PyQt
Forum Updated to NodeBB v4.3 + New Features

Load a .so object with QLibrary from PyQt

Scheduled Pinned Locked Moved Unsolved General and Desktop
14 Posts 2 Posters 3.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • I ilian

    Hello, I've been using QLibrary many times, however now I have a case when I want to load .so from PyQt. Following their docs it should be done the same way, but since it's python I don't follow why load() returns with False. Here is the simple .so code:

    interface.h:

    #ifndef INTERFACE_H
    #define INTERFACE_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int  init(int argc, char** argv);
    
    #ifdef __cplusplus
    };
    #endif
    

    I have and a .cpp file :
    interface.cpp

    #include "interface.h"
    #include "testwidget.h"
    
    #include <QApplication>
    
    int init(int argc, char **argv)
    {
        QApplication a(argc, argv);
        MyWidget w;
        w.init();
        return  a.exec();
    }
    

    Assume that testwidget is just a 200 x 200 empty window. So here is what is happening in python:

    import  os as UNIX
    import  sys
    from PyQt5 import QtCore
    
    def main(*args, **kwargs):
        testlib = QtCore.QLibrary('/home/ilian/Qt/build-testpyqtlib-Desktop_Qt_5_8_0_GCC_64bit-Debug/libtestpyqtlib.so')
    
        res = testlib.load()
        if res:
            print("OK, loaded library!")
        else:
            print("Failed to load library!")
    
    if __name__ == "__main__":
        main(sys.argv)
    

    Don't fire at me why I am doing it with 'PyQt, it's something inherited and I have to work with it. Just tell me why this call fails here? Everything is in place as directories. It just does not loads the .so` file.

    Regards.

    #endif // INTERFACE_H

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #2

    @ilian

    What does http://doc.qt.io/qt-5.9/qlibrary.html#errorString say after load()?

    https://forum.qt.io/topic/113070/qt-code-of-conduct

    I 1 Reply Last reply
    1
    • jsulmJ jsulm

      @ilian

      What does http://doc.qt.io/qt-5.9/qlibrary.html#errorString say after load()?

      I Offline
      I Offline
      ilian
      wrote on last edited by
      #3

      @jsulm That is dull now... it loaded. Maybe it was something with the python interpreter setup from the PyCharm don't know exactly.

      jsulmJ 1 Reply Last reply
      0
      • I ilian

        @jsulm That is dull now... it loaded. Maybe it was something with the python interpreter setup from the PyCharm don't know exactly.

        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #4

        @ilian In any case you should print out the output of errorString() to get more information next time it fails.

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        I 1 Reply Last reply
        0
        • jsulmJ jsulm

          @ilian In any case you should print out the output of errorString() to get more information next time it fails.

          I Offline
          I Offline
          ilian
          wrote on last edited by
          #5

          @jsulm Are you aware of PyQt, it resolved my init function with some sip.voidptr thing, that I don't know how to call. Originally I'd get a C function pointer but this sip.voidptr is not callable.

          jsulmJ 1 Reply Last reply
          0
          • I ilian

            @jsulm Are you aware of PyQt, it resolved my init function with some sip.voidptr thing, that I don't know how to call. Originally I'd get a C function pointer but this sip.voidptr is not callable.

            jsulmJ Offline
            jsulmJ Offline
            jsulm
            Lifetime Qt Champion
            wrote on last edited by jsulm
            #6

            @ilian What init function do you mean? Is it a function from your library? If so then sip.voidptr probably means that it could not resolve the function.
            See http://doc.qt.io/qt-5.9/qlibrary.html#resolve, you need to export your functions to be able to resolve them.

            https://forum.qt.io/topic/113070/qt-code-of-conduct

            I 1 Reply Last reply
            0
            • jsulmJ jsulm

              @ilian What init function do you mean? Is it a function from your library? If so then sip.voidptr probably means that it could not resolve the function.
              See http://doc.qt.io/qt-5.9/qlibrary.html#resolve, you need to export your functions to be able to resolve them.

              I Offline
              I Offline
              ilian
              wrote on last edited by
              #7

              @jsulm I have an init function

              extern "C" int init(int argc, char **argv)
              {
                  QApplication a(argc, argv);
                  MyWidget w;
                  w.init();
                  return  a.exec();
              }
              

              resolve() returns a non null value, which is sip.voidptr, and I am expecting this to be a C function pointer but, I have no idea how to call it.

              jsulmJ 1 Reply Last reply
              0
              • I ilian

                @jsulm I have an init function

                extern "C" int init(int argc, char **argv)
                {
                    QApplication a(argc, argv);
                    MyWidget w;
                    w.init();
                    return  a.exec();
                }
                

                resolve() returns a non null value, which is sip.voidptr, and I am expecting this to be a C function pointer but, I have no idea how to call it.

                jsulmJ Offline
                jsulmJ Offline
                jsulm
                Lifetime Qt Champion
                wrote on last edited by jsulm
                #8

                @ilian Please take a look at the link I posted before: you need to export your function, else it cannot be resolved.

                You are aware that a.exec() will block until you close your app? That means init() call will block.

                https://forum.qt.io/topic/113070/qt-code-of-conduct

                I 1 Reply Last reply
                1
                • jsulmJ jsulm

                  @ilian Please take a look at the link I posted before: you need to export your function, else it cannot be resolved.

                  You are aware that a.exec() will block until you close your app? That means init() call will block.

                  I Offline
                  I Offline
                  ilian
                  wrote on last edited by
                  #9

                  @jsulm I am aware yes, removed it, and just show the widget. However, I did the example with MY_EXPORT macro, I still get this voidptr. I will test in C++ program to see if there everything is OK.

                  jsulmJ 1 Reply Last reply
                  0
                  • I ilian

                    @jsulm I am aware yes, removed it, and just show the widget. However, I did the example with MY_EXPORT macro, I still get this voidptr. I will test in C++ program to see if there everything is OK.

                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by
                    #10

                    @ilian This void pointer is valid, but I don't know how to use it if it points to a function. Never did this with PyQt.

                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                    I 1 Reply Last reply
                    0
                    • jsulmJ jsulm

                      @ilian This void pointer is valid, but I don't know how to use it if it points to a function. Never did this with PyQt.

                      I Offline
                      I Offline
                      ilian
                      wrote on last edited by
                      #11

                      @jsulm I've made a similar C++ program with the function pointer, and it does what I want, open a widget and enters it's event loop. In short, as C++ program, loading the library everything is fine, as PyQt - it's not, or the reslove form PyQt and that sip.voidptr are some weird stuff, we know not of.

                      jsulmJ 1 Reply Last reply
                      0
                      • I Offline
                        I Offline
                        ilian
                        wrote on last edited by
                        #12

                        libc = CDLL('/home/ilian/git-projects/build-testpyqtlib-Desktop_Qt_5_7_1_GCC_64bit-Debug/libtestpyqtlib.so') That line of code solved it all, just called libc.init(0, 0) and the widget from the lib appeared...

                        1 Reply Last reply
                        0
                        • I ilian

                          @jsulm I've made a similar C++ program with the function pointer, and it does what I want, open a widget and enters it's event loop. In short, as C++ program, loading the library everything is fine, as PyQt - it's not, or the reslove form PyQt and that sip.voidptr are some weird stuff, we know not of.

                          jsulmJ Offline
                          jsulmJ Offline
                          jsulm
                          Lifetime Qt Champion
                          wrote on last edited by
                          #13

                          @ilian said in Load a .so object with QLibrary from PyQt:

                          sip.voidptr

                          this is not weird stuff :-)
                          It is documented, I just don't know how to use it if it contains a function pointer - I could not find anything in SIP documentation for this use case.

                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                          I 1 Reply Last reply
                          0
                          • jsulmJ jsulm

                            @ilian said in Load a .so object with QLibrary from PyQt:

                            sip.voidptr

                            this is not weird stuff :-)
                            It is documented, I just don't know how to use it if it contains a function pointer - I could not find anything in SIP documentation for this use case.

                            I Offline
                            I Offline
                            ilian
                            wrote on last edited by
                            #14

                            @jsulm Yes, same here, I don't know how to solve that problem, I was expecting a better examples how to make it the C way here, alas none was present.

                            1 Reply Last reply
                            0

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved