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 Offline
    I Offline
    ilian
    wrote on last edited by
    #1

    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 1 Reply Last reply
    0
    • 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