Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Special Interest Groups
  3. C++ Gurus
  4. Redistribute a dynamic library: c++ in header and issues when mixing compilers
Forum Updated to NodeBB v4.3 + New Features

Redistribute a dynamic library: c++ in header and issues when mixing compilers

Scheduled Pinned Locked Moved C++ Gurus
15 Posts 4 Posters 6.9k 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.
  • F Offline
    F Offline
    Franzk
    wrote on last edited by
    #5

    The main issues are with name mangling (have a look at the weird function names when you have linker errors), which is different for practically every tool chain. There is no real reason to avoid C++ in your library exports unless you want to serve all compilers with one build. If Qt would be avoiding C++ exports in their dll's we would be working against a pure C interface, but that means Qt have to go the extra mile to support other compilers as well.

    If you want to provide C++ in your interface, just make sure you cover the compilers the other developer might use with a build for that specific one.

    There is also the issue of calling conventions (stdcall, cdecl, fastcall, thiscall, whatever), which is not standardized either. For C linkage, everything is standardized. I don't think the C++ guys addressed this in c++0x either, but we'll see (would be great if they did).

    "Horse sense is the thing a horse has which keeps it from betting on people." -- W.C. Fields

    http://www.catb.org/~esr/faqs/smart-questions.html

    1 Reply Last reply
    0
    • J Offline
      J Offline
      JulienMaille
      wrote on last edited by
      #6

      Hum, you example with Qt looks like a counterexample, doesn't it?
      There are a mingw and a msvc precompiled version of Qt. Maybe for this reason, no?

      1 Reply Last reply
      0
      • F Offline
        F Offline
        Franzk
        wrote on last edited by
        #7

        [quote author="neFAST" date="1304105450"]Hum, you example with Qt looks like a counterexample, doesn't it?
        There are a mingw and a msvc precompiled version of Qt. Maybe for this reason, no?[/quote]You got my point exactly. However, this broad support for multiple compilers leads to a lot of builds, which is the approach taken by Qt. If you don't want that, you should go for C linkage.

        "Horse sense is the thing a horse has which keeps it from betting on people." -- W.C. Fields

        http://www.catb.org/~esr/faqs/smart-questions.html

        1 Reply Last reply
        0
        • J Offline
          J Offline
          JulienMaille
          wrote on last edited by
          #8

          And what step in C++ code compilation cause this problem that I won't have with pure C?
          I know google is my friend but maybe you know a nice place where I should learn a bit more about c++ compilers.
          Thanks again for your help.

          1 Reply Last reply
          0
          • F Offline
            F Offline
            Franzk
            wrote on last edited by
            #9

            "Binary compatibility":http://rlc.vlinder.ca/blog/2009/08/binary-compatibility/

            "Horse sense is the thing a horse has which keeps it from betting on people." -- W.C. Fields

            http://www.catb.org/~esr/faqs/smart-questions.html

            1 Reply Last reply
            0
            • G Offline
              G Offline
              giesbert
              wrote on last edited by
              #10

              [quote author="neFAST" date="1304106257"]And what step in C++ code compilation cause this problem that I won't have with pure C?
              I know google is my friend but maybe you know a nice place where I should learn a bit more about c++ compilers.
              Thanks again for your help.[/quote]

              Inside the MSVS tool chain, you also have to use the same version (MSVS 2005 or MSVS 2005 SP1 or MSVS 2008 or MSVS 2008 SP1 or MSVS 2010) as all of these versions use different msvcrt dlls. msvcrt is the microsoft C-runtime lib which implements all the heap and memory stuff. If you mix them using Qt (where the responsibility of deleting memory goes from binary to binary), you program will crash.

              There, name mangling etc would work, but heap management not between the versions of the MSVS:-(

              Nokia Certified Qt Specialist.
              Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

              1 Reply Last reply
              0
              • F Offline
                F Offline
                Franzk
                wrote on last edited by
                #11

                That's why they call it "DLL hell":http://en.wikipedia.org/wiki/DLL_hell...

                "Horse sense is the thing a horse has which keeps it from betting on people." -- W.C. Fields

                http://www.catb.org/~esr/faqs/smart-questions.html

                1 Reply Last reply
                0
                • J Offline
                  J Offline
                  JulienMaille
                  wrote on last edited by
                  #12

                  Thanks again for your links.
                  Anyone has a nice example of a good and smart pure C exports implementing something class-like?

                  1 Reply Last reply
                  0
                  • F Offline
                    F Offline
                    Franzk
                    wrote on last edited by
                    #13

                    Read through "Building Your Own Plugin Framework":http://drdobbs.com/cpp/204202899?pgno=1.

                    "Horse sense is the thing a horse has which keeps it from betting on people." -- W.C. Fields

                    http://www.catb.org/~esr/faqs/smart-questions.html

                    1 Reply Last reply
                    0
                    • G Offline
                      G Offline
                      giesbert
                      wrote on last edited by
                      #14

                      [quote author="neFAST" date="1304320729"]Thanks again for your links.
                      Anyone has a nice example of a good and smart pure C exports implementing something class-like?[/quote]

                      If you need classes, you need C++,
                      Otherwise something like functions that get handles (which might be internal class pointers).
                      Then all parameters in the functions must be C-parameters (pods or structs, no QString, STL, etc)

                      Nokia Certified Qt Specialist.
                      Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz)

                      1 Reply Last reply
                      0
                      • F Offline
                        F Offline
                        Franzk
                        wrote on last edited by
                        #15

                        You can of course do something like

                        @ typedef struct Object {
                        void (*setData)(struct Object *, int);
                        int (*data)(struct Object *);
                        int m_data;
                        } Object;

                        Object *objectConstructor()
                        {
                        Object *o = malloc(sizeof(Object));
                        memset(o, 0, sizeof(Object));
                        o->setData = objectSetData;
                        o->data = objectData
                        return o;
                        }

                        void objectSetData(Object *this, int data)
                        {
                        this->m_data = data;
                        }

                        int objectData(Object *this)
                        {
                        return this->m_data;
                        }
                        @

                        But that would arguably obscure your code for the simple fact that you have to explicitly pass the this argument:
                        @
                        Object *o = objectConstructor();
                        o->setData(o, 5);
                        printf("%d\n", o->data(o));
                        @
                        thereby making the function pointers look rather awkward.

                        "Horse sense is the thing a horse has which keeps it from betting on people." -- W.C. Fields

                        http://www.catb.org/~esr/faqs/smart-questions.html

                        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