快要下班的时候,开发部的一名小鲜肉找我帮忙解决一个问题:

才哥,我们提供给计费组的库在计费主机上编译报错了,但是提供给其他组用时没有编译报错。计费也不认,说编译器报的是我们代码上的错误,要我解决,帮我看看呢,这是报错信息:

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++编译错误的更多相关文章

  1. oracle简单存储过程以及如何查看编译错误

    oracle简单存储过程以及如何查看编译错误; CREATE OR REPLACE PROCEDURE procedure_test ISval VARCHAR2(200);BEGIN /* val ...

  2. xcode工程编译错误:No architectures to compile for

    问题 开发环境:xcode6,iPhone6模拟器 xcode工程编译错误:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active ...

  3. 35.Intellij IDEA设置忽略部分类编译错误

    转自:https://www.aliyun.com/jiaocheng/290360.html 有些时候我们的项目中有些错误,但这些错误并不影响项目的整体运行(或许是没有使用到),默认情况下idea是 ...

  4. 利用huson的日志获取编译错误信息的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 使用hudson编译一百多个VC工程,输出的日志有6M之大,摆在我面前的一个问题是如何利用这个日志信息来获取编译错误信 ...

  5. C++编译错误 --- 成员函数定义在 .h 文件中出现重定义错误(Error LNK 2005)

    今天写了一个简单的类,定义在 .h 文件中, 类很简单就将其成员函数定义在了一起(class类后面).运行的时候出现了如下图所示的编译错误(error LNK2005) 查资料,大部分都是说需要加上 ...

  6. Intellij IDEA设置忽略部分类编译错误

    有些时候我们的项目中有些错误,但这些错误并不影响项目的整体运行(或许是没有使用到),默认情况下idea是无法通过编译的,因此也就无法部署运行,要达到正确运行项目的目的需要作一些设置才行. 设置Inte ...

  7. openbmc编译错误汇总,持续更新,建议收藏

    本文汇总自己在编译openbmc时遇到的一些问题及解决思路,希望对有兴趣研究openbmc的同学有一些帮助. 项目地址:https://github.com/openbmc/openbmc 编译步骤: ...

  8. xamarin.forms新建项目android编译错误

    vs2015 update3 新建的xamarin.forms项目中的android项目编译错误.提示缺少android_m2repository_r22.zip,96659D653BDE0FAEDB ...

  9. 《转载》使用org.w3c.dom.Element的setTextContent()、getTextContent()方法时出现编译错误

    今天在更新项目后进行编译时,出现如下错误一堆: 编译错误 Google之,在stackoverflow上看到如下的解决方法: I came here with the same problem. Ev ...

随机推荐

  1. python SQL注入测试脚本(更新中)

    import requests import json import warnings warnings.filterwarnings("ignore") url = 'https ...

  2. if not

    if not x 在python中的意思是如果x为空 a = [] if not a: print 1 此代码会打印出1 a = [1,2,3] if not a: print 1 此代码不会打印出1 ...

  3. python3的print函数

    print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出: >>> print('The quick brown fox', 'jumps over', 'the ...

  4. js 实现 文字打印效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. jpa多条件查询

    首先继承JpaSpecificationExecutor<T>接口 需要用到JpaSpecificationExecutor<T>中的Page<T> findAll ...

  6. VC MFC工具栏(CToolBar)控件(转)

    工具栏 工具栏控件在控件面板里没有对应的选项(图标),但有一个工具栏控件类CToolBar,所以我们如果要创建一个工具栏控件并显示在窗口里的话,只能用代码来完成,事实上任何一种控件,都可以用代码创建, ...

  7. Mac 开发配置手册

    转自:http://www.cocoachina.com/mac/20141112/10198.html 手册内容为「如何让一部全新的 MacBook 快速完成开发环境配置」,主要面向 Web 开发者 ...

  8. 使用C#的AssemblyResolve事件和TypeResolve事件动态解析加载失败的程序集

    我们知道反射是 依赖注入 模式的基础,依赖注入要求只在项目中引用定义接口的程序集,而不引用接口实现类的程序集,因为接口实现类的程序集应该是通过反射来动态加载的,这样才能保证接口与其实现类之间的松耦合. ...

  9. 解决vue变量未渲染前代码显示问题

    在网络加载缓慢或者刷新的时候总会有那么一瞬间出现vue的模板代码,实在很影响美观,对于我这种有强迫症的人来说实在是忍无可忍,后来经过查找资料,终于发现了解决方法,可以使用vue现成的指令来解决这个问题 ...

  10. 『ACM C++』 PTA 天梯赛练习集L1 | 042-43

    记录刷题情况 ------------------------------------------------L1-042--------------------------------------- ...