Search code examples
c++qt4qmakedylib

exporting symbols in a dynamic qt library


I'm trying to create a dynamic library using Qt on OS X 10.6.7 and Qt 4.7.3. I have created the most basic test I can think of (see below or https://gist.github.com/1016045) and yet

otool -T build/libstackoverflow.dylib 

still reports

build/libstackoverflow.dylib:
Table of contents (0 entries)
module index symbol index

I'm assuming I should see something else in that list related to factorial.

Test case (also at: https://gist.github.com/1016045):

// main.cpp

#include <stdint.h>
#include <QtCore/QtGlobal>

#if defined(MYSHAREDLIB_LIBRARY)
#  define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
#else
#  define MYSHAREDLIB_EXPORT Q_DECL_IMPORT
#endif

MYSHAREDLIB_EXPORT uint64_t factorial(int max) {
    int i           = max;
    uint64_t result = 1;

    while (i >= 2)
        result *= i--;

    return result;
}


// stackoverflow.pro

TEMPLATE = lib
DEFINES += MYSHAREDLIB_LIBRARY
CONFIG += qt dll
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .
DESTDIR = ./build

# Input
SOURCES += main.cpp

To build:

qmake
make

I've read:

Please recommend other resources if applicable!

EDIT:

I believe the symbols might be being exported correctly, although their names are mangled (or at least appear to be), which I thought using the Q_DECL_EXPORT macro was supposed to avoid. For example, here is the result of running nm -g build/libstackoverflow.dylib:

0000000000001f20 T __Z9factoriali
                 U ___gxx_personality_v0
                 U dyld_stub_binder

Is this what I should expect?


Solution

  • I don't think just exporting will disable C++ name mangling. If you have "plain C" functions you want to export without mangling, you'll need to wrap their declaration in an extern "C" {} block (in a header preferably of course).

    Name mangling doesn't prevent successful linking, as long as the "client" code is also compiled with a C++ compiler. If you want them both available to C and C++, the extern "C", conditionally defined depending on C/C++ compiler, is necessary AFAIK.