导出动态qt库中的符号
exporting symbols in a dynamic qt library
我正试图在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。
相关文章:
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- Qt QSpinbox在设置范围后接受'+'符号
- Qt C++LNK2019:使用QNetworkAccessManager未解析的外部符号
- 与Qt交叉编译到Raspberry Pi 3B+通讯录(协议缓冲区)-错误符号查找错误
- 检测键按事件 - Qt C++上的插入符号 (^) 键
- Qt Creator项目打破:"找不到建筑x86_64符号"
- QT QT QBYTEARRAY无符号数据类型
- 使用层类时的 QT 未解析外部符号
- VTK / ITK/ QT - 未解决的外部符号错误 (LNK2001)
- QT:尝试在QT中使用Python.h时未定义的符号
- QT创建者:简单程序未解决的外部符号和外部符号错误
- 使用现有C程序编写Qt程序时未找到的符号
- Qt 和 CMake 失败并出现重复的符号
- 部署后的Linux qt应用程序-符号查找错误:libQt5Core.so.5未定义的符号:uncv_getDefaul
- 将Qt项目转换为VC++项目 - 未解析的外部符号
- LNK2019:未解析的外部符号(Qt+cplex)
- 将QString/QByteArray转换为科学符号qt
- 未解析符号:Qt和OpenCV
- 找到一个或多个乘法定义的符号 Qt
- 未解决的外部符号- Qt创建者