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?
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.