导出动态qt库中的符号

exporting symbols in a dynamic qt library

本文关键字:符号 qt 动态      更新时间:2023-10-16

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

我读过:

  • 创建自定义QT库
  • http://developer.qt.nokia.com/doc/qt-4.7/sharedlibrary.html

如果适用,请推荐其他资源!

编辑:

我相信这些符号可能被正确导出了,尽管它们的名称被篡改了(或者至少看起来是),我认为使用Q_DECL_EXPORT宏应该避免这种情况。例如,以下是运行nm-gbuild/libstackoverflow.dylib:的结果

0000000000001f20 T __Z9factoriali
                 U ___gxx_personality_v0
                 U dyld_stub_binder

这是我应该期待的吗?

我不认为仅仅导出就可以禁用C++名称篡改。如果您有"纯C"函数想要在不损坏的情况下导出,则需要将它们的声明包装在extern "C" {}块中(当然最好是在标头中)。

名称篡改并不妨碍成功链接,只要"客户端"代码也是用C++编译器编译的。如果您希望它们都可用于C和C++,则根据C/C++编译器有条件定义的extern "C"是必需的AFAIK。