一次简单的C++编译错误
快要下班的时候,开发部的一名小鲜肉找我帮忙解决一个问题:
才哥,我们提供给计费组的库在计费主机上编译报错了,但是提供给其他组用时没有编译报错。计费也不认,说编译器报的是我们代码上的错误,要我解决,帮我看看呢,这是报错信息:
pbobject.h:129: error: reference to 'Message' is ambiguous
message.h:169: error: candidates are: class google::protobuf::Message
Message.h:28: error: class Bmco::Message
pbobject.h:129: error: reference to 'Message' is ambiguous
message.h:169: error: candidates are: class google::protobuf::Message
Message.h:28: error: class Bmco::Message
pbobject.h:129: error: 'Message' has not been declared
我一看是模糊定义,是二义性问题,大概有了谱。
最开始的想法是找到编译报错的cpp文件,使用g++ -E选项把编译转换单元展开看看到底是哪里重复定义了。但是由于计费组的make输出太复杂太长,看不出来。于是直接在计费的代码目录下使用find命令全文搜索了“class Message”,发现果真有一个类定义。但是有一个问题是开发部这边使用的protocol buffer下面的Message应该是要用名字空间“google::protobuf” 来限定访问,不应该有这样的问题,于是查看了开发部提供的.h文件 赫然有一个“using namespace google::protobuf”,于是谜底揭开了,还是开发部这边提供的头文件问题,为什么其他组没有遇到问题?那是运气好,别人没有定义全局的Message类。
解决办法就是让开发部的小鲜肉把头文件的using namespace google::protobuf去掉,把所有函数参数,对象,指针定义Message的地方通过显示的名字空间访问。
总的来说还是开发部的代码不规范,既然是要提供库给其他模块,那么首先就应该定义一个属于开发部这边的名字空间,所有要提供出去的名称都在这个名字空间下来声明。 名字空间就是专门来解决这种问题的,这种错误不应该犯。
一次简单的C++编译错误的更多相关文章
- oracle简单存储过程以及如何查看编译错误
oracle简单存储过程以及如何查看编译错误; CREATE OR REPLACE PROCEDURE procedure_test ISval VARCHAR2(200);BEGIN /* val ...
- xcode工程编译错误:No architectures to compile for
问题 开发环境:xcode6,iPhone6模拟器 xcode工程编译错误:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active ...
- 35.Intellij IDEA设置忽略部分类编译错误
转自:https://www.aliyun.com/jiaocheng/290360.html 有些时候我们的项目中有些错误,但这些错误并不影响项目的整体运行(或许是没有使用到),默认情况下idea是 ...
- 利用huson的日志获取编译错误信息的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 使用hudson编译一百多个VC工程,输出的日志有6M之大,摆在我面前的一个问题是如何利用这个日志信息来获取编译错误信 ...
- C++编译错误 --- 成员函数定义在 .h 文件中出现重定义错误(Error LNK 2005)
今天写了一个简单的类,定义在 .h 文件中, 类很简单就将其成员函数定义在了一起(class类后面).运行的时候出现了如下图所示的编译错误(error LNK2005) 查资料,大部分都是说需要加上 ...
- Intellij IDEA设置忽略部分类编译错误
有些时候我们的项目中有些错误,但这些错误并不影响项目的整体运行(或许是没有使用到),默认情况下idea是无法通过编译的,因此也就无法部署运行,要达到正确运行项目的目的需要作一些设置才行. 设置Inte ...
- openbmc编译错误汇总,持续更新,建议收藏
本文汇总自己在编译openbmc时遇到的一些问题及解决思路,希望对有兴趣研究openbmc的同学有一些帮助. 项目地址:https://github.com/openbmc/openbmc 编译步骤: ...
- xamarin.forms新建项目android编译错误
vs2015 update3 新建的xamarin.forms项目中的android项目编译错误.提示缺少android_m2repository_r22.zip,96659D653BDE0FAEDB ...
- 《转载》使用org.w3c.dom.Element的setTextContent()、getTextContent()方法时出现编译错误
今天在更新项目后进行编译时,出现如下错误一堆: 编译错误 Google之,在stackoverflow上看到如下的解决方法: I came here with the same problem. Ev ...
随机推荐
- 静态路由解决双外卡,PC做路由器的实现
1,曾经医院,有两个网卡,一个内,一个外,但都有网关(192.168.1.246. 192. 168.6.1) 这样同一时候开启就会出现网络不通. 当时并没有细究原因. 这次医院信息化项目上马,我学到 ...
- BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也 ...
- BZOJ3999:[TJOI2015]旅游(树链剖分)
Description 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝石,有一定的价格.ZJY为了赚取最高利益,她会 ...
- 【[CQOI2014]数三角形】
lx让做的题,其实很简单,难度评到紫令人吃惊 首先读进来\(n,m\)先\(++\),之后就是一个格点数为\(n*m\)的矩阵了 我们直接求很那做,补集转化一下,我们容斥来做 首先所有的情况自然是\( ...
- luogu P1642 规划
嘟嘟嘟 看到最后让求一个比值,应该得往01规划上去想.令x = ∑v[i] / ∑c[i],则x * ∑c[i] = ∑v[i], ∑(v[i] - x * c[i]) = 0. 于是可以二分x(注意 ...
- 2spring注解:@Lazy,@Conditional,@import,FactoryBean接口
大致的工程内容也来源于上一篇博文! https://www.cnblogs.com/Mrchengs/p/10108603.html 1.@Lazy懒加载 懒加载:针对单实例的 单实例bean,默认在 ...
- Url快捷方式转超链接页
效果:(打了码 可以感受到效果) 问题: 近期发现了之前的一些网页快捷方式文件有50个 查看起来实在不方便 解决: 目前想到了两种 (书签法) (类书签法) 第一种简单快速 (当然有掌握写技巧) ...
- 理解JavaScript对象
理解JavaScript对象 对象是JavaScript的基本数据类型.对象是一种复合值:将很多值(原始值或者其他对象)聚合在一起. JavaScript对象不仅可以保持自有的属性,还可以从原型对象继 ...
- vue+elementUI封装的时间插件(有起始时间不能大于结束时间的验证)
vue+elementUI封装的时间插件(有起始时间不能大于结束时间的验证): html: <el-form-item label="活动时间" required> & ...
- HDU 1013 Digital Roots(to_string的具体运用)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1013 Digital Roots Time Limit: 2000/1000 MS (Java/Othe ...