• 4323阅读
  • 7回复

[提问]问一个共享库的问题? [复制链接]

上一主题 下一主题
离线tangbao203
 

只看楼主 倒序阅读 楼主  发表于: 2012-08-07
创建一个共享库,我并没有用任何  Q_DECL_IMPORT  Q_DECL_EXPORT 类似的宏.
然后静态的使用, 没有任何问题, (pro文件加入了 LIBS +="XXX.dll")

   静态调用 ,Q_DECL_IMPORT  Q_DECL_EXPORT 这样的导入与导出 宏可以省略?

   还是动态调用时候 不能省略 ?


离线dbzhang800

只看该作者 1楼 发表于: 2012-08-07
你确定没有使用上面的宏 或者 __declspec(dllexport) 或其他类似的东西?
离线tangbao203

只看该作者 2楼 发表于: 2012-08-07
回 1楼(dbzhang800) 的帖子
没有呀, 我试了一下(使用向导创建静态库) 编译成静态库,
就没有 xxx_global.h文件的声明 的
#if defined(xxx_LIBRARY).
    ....
    ....
#endif
离线dbzhang800

只看该作者 3楼 发表于: 2012-08-07
Re:回 1楼(dbzhang800) 的帖子
引用第2楼tangbao203于2012-08-07 14:32发表的 回 1楼(dbzhang800) 的帖子 :
没有呀, 我试了一下(使用向导创建静态库) 编译成静态库,
就没有 xxx_global.h文件的声明 的
#if defined(xxx_LIBRARY).
    ....
    ....
.......

有点糊涂了, 你想表达的到底是动态库还是静态库呢?
离线tangbao203

只看该作者 4楼 发表于: 2012-08-07
静态的载入共享库. 不需要声明 Q_DECL_EXPORT ?
离线roywillow

只看该作者 5楼 发表于: 2012-08-07
你可以看一下Q_DECL_EXPORT之类的宏的定义是什么
就算你在类的声明中加入了这两个宏,最后编译的时候如果你非要编译成staticlib,那么它会直接按照静态库的相关定义来展开
在我印象中,如果编译的时候是staticlib,Q_DECL_EXPORT这个宏的展开其实是个空白
而在使用这个库的过程中,这些宏则会按照你使用的需求来展开,比如你用的是个静态库,这东西展开的还是个空白

专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线tangbao203

只看该作者 6楼 发表于: 2012-08-08
回 5楼(roywillow) 的帖子
你的意思也就说:静态的载入 库(无论是静态库,还是共享库),都不需要声明 Q_DECL_EXPORT

只有 动态的载入 共享库 才要声明这个Q_DECL_EXPORT.
离线dbzhang800

只看该作者 7楼 发表于: 2012-08-08
我简单说一下吧:

首先:动态库(共享库)的两种使用方式,最好叫做“显式”和“隐式”,叫做动态和静态有些别扭,特别是你还同时涉及动态库和静态库

其次:需要不需要 __declspec(dllexport) 取决于你所用的编译器和链接器。比如你使用的MSVC的话,则必要要选择那些符号需要导出。而如果使用GCC系列,由于所有符号默认都被导出,一般就不需要这些相应的东西

再次:静态库可以认为就是编译后的目标文件的一个压缩包,完全不涉及这些问题。
快速回复
限100 字节
 
上一个 下一个