2011-06-09 40 views
2

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

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 

这是我应该期待的吗?

回答

2

我不认为只是导出将禁用C++名称mangling。如果你有一个“普通的C”函数,你想要导出没有格式化,你需要将它们的声明包装在一个extern "C" {}块中(当然最好在头文件中)。

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

+0

谢谢!今晚下班后我会试试这个。 – Andrew 2011-06-09 15:16:06

+0

在这种情况下,我正在编译一个Qt库并尝试使用node-ffi(https://github.com/rbranson/node-ffi/)来引用它。添加外部“C”确实使符号可用!所以谢谢你的建议! – Andrew 2011-06-11 22:34:53