экспорт символов в динамическую библиотеку qt - PullRequest
2 голосов
/ 09 июня 2011

Я пытаюсь создать динамическую библиотеку, используя Qt на OS X 10.6.7 и Qt 4.7.3.Я создал самый базовый тест, который только могу себе представить (см. Ниже или https://gist.github.com/1016045), и все же

otool -T build/libstackoverflow.dylib 

все еще сообщает

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

Я предполагаю, что должен увидетьчто-то еще в этом списке связано с факториалом.

Контрольный пример (также по адресу: 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

Для построения:

qmake
make

Я прочитал:

Пожалуйста, порекомендуйте другие ресурсы, если применимо!

РЕДАКТИРОВАТЬ:

Я полагаю, что символы могут быть экспортированы правильно, хотя их имена искажены (или, по крайней мере, кажется), что я думал, используя макрос Q_DECL_EXPORT, чтобы избежать. Например, вотрезультат запуска nm -g build / libstackoverflow.dylib:

0000000000001f20 T __Z9factoriali
                 U ___gxx_personality_v0
                 U dyld_stub_binder

Это то, что я должен ожидать?

1 Ответ

2 голосов
/ 09 июня 2011

Я не думаю, что простой экспорт отключит искажение имен в C ++. Если у вас есть функции "обычного C", которые вы хотите экспортировать без искажения, вам нужно обернуть их объявление в блок extern "C" {} (желательно в заголовок, конечно).

Перенос имен не препятствует успешному связыванию, если «клиентский» код также компилируется компилятором C ++. Если вы хотите, чтобы они оба были доступны для C и C ++, AFAIK необходим extern "C", условно определенный в зависимости от компилятора C / C ++.

...