注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

勇敢的劳尤条

 
 
 

日志

 
 

SSQLS sql_create_ multiple definition of `userItem::table_' `userItem::names'的错误解决  

2013-10-29 09:20:08|  分类: mysql相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

我在使用mysql++过程中,碰到了这个错误。

obj/Debug/regSerHandleCb.o:(.data+0x10): multiple definition of `userItem::table_'
obj/Debug/regSerDB.o:(.data+0x10): first defined here
obj/Debug/regSerHandleCb.o:(.data+0x0): multiple definition of `userItem::names'
obj/Debug/regSerDB.o:(.data+0x0): first defined here

原因是

//myhead.h当中定义了下面这个宏

sql_create_2(...)


//work1.cpp

#include"myhead.h"


//work2.cpp

#include"myhead.h"


也就是说,在work1.cpp和work2.cpp中都包含了myhead.h这个头文件。

这只是表面原因,但是本质上是因为http://lists.mysql.com/plusplus/6199

Every SSQLS type includes two static member variables; _table is one. If you don't do anything to avoid it, they're assigned default values within the sql_create_* macro, so if the compiler sees that macro call twice, it sees two separate assignments to a static member variable, which annoys it.

To fix this, I would put the sql_create_* macro in a separate .h file, and #define MYSQLPP_SSQLS_NO_STATICS above all #includes for that file except for one.  This ensures that the static members are assigned to only once.  You can see this pattern in action in the examples: the 'stock' SSQLS type is defined in stock.h, and it is included in both util.cpp and in custom*.cpp.

在多个模块中使用一个SSQLS,可以在一个头文件中定义这个SSQLS结构,将会很方便的使用它。但是这样的话,你可能引发一些问题。因为每个SSQLS结构中都会保存一些静态常用数据(例如表名和字段名列表),如果你在多个模块里使用#include包含这个头文件的话,你将会在链接时候得到一个重复定义的错误。


/****************ps***********************************************************************************************************/
这个问题原先也不好解决,百度无果,后来谷歌下面的关键字,立马出结果。另外,碰到问题最好能去mysql++官网的maillist那里去查看,看看别人遇到过的问题。还有,认真看看user manual,其实里面还是有讲到的,用户手册很重要,谷歌也很重要。

SSQLS  sql_create multiple definition of

/**********************************************************************************************************************************/

你 在 所 有 引 用 模 块 中 都 定 义 一 个 预 处 理 宏MYSQLPP_SSQLS_NO_STATICS,但是保留其中一个文件不要定义该宏。如果定义了这个宏,将意味着在该宏之后的所有SSQLS内静态成员变量将无效。


我们假设有一个文件 my_ssqls.h内包含了sql_create_N 宏,这个宏定义了一个SSQLS.而这个SSQLS被至少两个模块使用。其中一个我们将foo.cpp ,另外一个叫my_ssqls.cpp。我们可以随便选择一个文件,认为它“拥有”了这个SSQLS,而另外一个文件,仅仅是“使用”了这个SSQLS。那么我们可以如下使用:


// 文件foo.cpp,我们假设它仅仅是使用了SSQLS,而没有拥有这个SSQLS
#define MYSQLPP_SSQLS_NO_STATICS
#include"my_ssqls.h"


// 文件my_ssqls.cpp,我们假设它拥有了这个SSQLS,则它不需要额外的宏定义,只需要正常包含头文件即可
#include"my_ssqls.h"




对于更多模块使用同一个SSQLS

如果我们不止两个模块使用了这个SSQLS,我们需要在大部分“使用”这个SSQLS的文件前增加额外的宏定义。此时我们可以有个更简单的方法。
// 文件my_ssqls.h:
#if!defined(EXPAND_MY_SSQLS_STATICS)
# define MYSQLPP_SSQLS_NO_STATICS
#endif
sql_create_X(Y,Z....)//SSQLS的定义


// 文件foo.cpp, 一个普通的SSQLS“使用者”
#include"my_ssqls.h"


// 文件my_ssqls.cpp,特殊的唯一的那个SSQLS“拥有者”
#define EXPAND_MY_SSQLS_STATICS
#include"my_ssqls.h"

这样我们可以免除对大量的“使用者”定义那个宏,只要“拥有者”定义一个宏即可。


根据上面的方法,其实还是有小小问题。
如果所有的cpp都是“使用者”,会怎么样呢?我一样可以运行程序。
有时候“所有者”和“使用者”互换角色,错误继续出现?
EXPAND_MY_SSQLS_STATICS这种方法一直没能尝试成功,为何?

  评论这张
 
阅读(142)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017