在动态qt库中导出符号

时间:2011-06-09 03:35:39

标签: c++ qt4 qmake dylib

我正在尝试使用OS X 10.6.7和Qt 4.7.3上的Qt创建动态库。我创建了我能想到的最基本的测试(见下文或https://gist.github.com/1016045)但

otool -T build/libstackoverflow.dylib 

仍然报告

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

我假设我应该在该列表中看到与factorial相关的其他内容。

测试用例(也在: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 个答案:

答案 0 :(得分:2)

我认为只是导出会禁用C ++名称修改。如果你想要导出“普通C”函数而不进行修改,你需要将它们的声明包装在extern "C" {}块中(当然最好在标题中)。

名称修改不会阻止成功链接,只要“客户端”代码也使用C ++编译器编译即可。如果您希望它们都可用于C和C ++,那么根据C / C ++编译器有条件地定义的extern "C"是必需的AFAIK。