2

我正在尝试在 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

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

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

这是我应该期待的吗?

4

1 回答 1

2

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

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

于 2011-06-09T05:25:10.123 回答