—2022-07-15 补充—
再次看这个问题很奇怪, #include 'HeadFile.h" 不是很常见的引入头文件形式吗?
如常见的 #include<stdio.h>,多个文件 include 也没报错啊。
原因: include的文件,如果只是方法声明 ok。 但包含 方法定义,就报错。
(好比,甲乙丙都说 我要丁帮忙,那ok。 但甲要高个子丁, 乙要矮个子, 丙要中等个子丁。 那肯定报错,我们就一个丁)

Context

  1. 在HeaderFile.h头文件了声明一个 LOG() 方法

    void LOG(std::string s)
    {std::cout << s << std::endl;
    }
    
  2. 在SourceFile1.cpp里 #include “HeaderFile.h”
  3. 在SourceFile2.cpp里 #include “HeaderFile.h”

编译报错, a方法 duplicate symbol

实际报错的log

上文的Context只是说明关系,swapElement就等于上文的a方法, MergeSort.cpp TestSort.cpp等价于SourFile1.cpp、SourceFile2.cpp

 clang++ MergeSort.cpp TestSort.cpp -o testExecute
duplicate symbol __Z11swapElementPiii in:/var/folders/wv/16gvb9rd4v540qx_6vry7vqh0000gn/T/MergeSort-dd8696.o/var/folders/wv/16gvb9rd4v540qx_6vry7vqh0000gn/T/TestSort-0defcb.o

原因

  • C++,方法不能被重复声明。
  • 编译阶段:#include “HeaderFile.h”,等于复制 HeaderFile.h 文件内容到 #include的位置。
  • 编译输出:每个cpp文件被编译成.o文件,所以MergeSort.o,TestSort.o文件内,都copy了HeaderFile.h内的内容(即方法声明)
  • 链接(Link)阶段:链接每个.o文件成为最终的 可执行文件。链接MergeSort.o,TestSort.o,出现两个方法声明,异常报错 duplicate symbol

3种解决方法:

源码文件里,方法名称 为symbol(符号),相对概念是 内存地址,如LOG方法在 内存中的地址是什么。

消除symbol

  1. 将method声明为inline。inline 方法的方法体,会被直接copy到 方法调用的地方。(也就是 链接阶段是 没有这个方法的)

    inline void LOG(std::string s)
    {std::cout << s << std::endl;
    }
    
  2. 采用宏定义#define LOG(s) (std::cout << s << std::endl),相当于不是方法了,就是文本替换了。

可见性

只在单个.o文件内可见
3. 将方法声明为static(表示方法不能被share,生成的symbol只在文件内可见)

参考文档

C解决duplicate symbol相关推荐

  1. 【原】IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突)

    [原]IOS合并lib(.a)库的终极可用方法(可用于解决duplicate symbol静态库冲突) 参考文章: (1)[原]IOS合并lib(.a)库的终极可用方法(可用于解决duplicate ...

  2. 解决使用CoreData时报duplicate symbol错误问题

    2019独角兽企业重金招聘Python工程师标准>>> 也不知道是那个XCode版本后对CoreData这块做了调整,我用的是XCode8,按照原来的步骤添加了实体,然后通过菜单Ed ...

  3. ios 重复引用 静态库_iOS 解决一个因三方静态库冲突产生的duplicate symbol的问题...

    转自:http://www.cnblogs.com/rayshen/p/5160218.html 最近在开发项目时编译三方.a时出现了冲突,原因是存在duplicate symbol. <1&g ...

  4. Duplicate Symbol链接错的原因总结和解决方法

    Duplicate Symbol链接错的原因总结和解决方法 duplicate symbol(符号复制,即有相同的文件名)是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在.但是经过一段时 ...

  5. 解决 Xcode下使用公用静态库,出现的Duplicate Symbol错误

    解决 Xcode下使用公用静态库,出现的"Duplicate Symbol"错误 分类: iPhone/iPad开发技术 2013-11-08 14:20  227人阅读  评论( ...

  6. Duplicate Symbol链接错误的原因总结和解决方法[转]

    from:http://www.cocoachina.com/bbs/read.php?tid=177492 duplicate symbol是一种常见的链接错误,不像编译错误那样可以直接定位到问题的 ...

  7. 【转】XCode: duplicate symbol 解决方案

    遇到引用库重复定义的问题,需要解决.项目需要,同时引用ZBar和QQ授权登录SDK,由于二者均使用了Base64处理数据,XCode编译时报错: duplicate symbol _base64_en ...

  8. 静态库的冲突 duplicate symbol

    错误log: duplicate symbol _stateBuffer in: /Users/tong/Desktop/gt3-ios-sdk-develop/GT3Example/GT3Exmap ...

  9. 链接报错:ld: 1 duplicate symbol for architecture x86_64

    一.问题原因 ld: 1 duplicate symbol for architecture x86_64 出现错误的原因是:重复定义. 完整的报错信息: ld: 1 duplicate symbol ...

  10. c语言调试过程中的错误,C语言调试过程中duplicate symbol错误分析

    说明:在我们调试C语言的过程中,经常会遇到duplicate symbol错误(在Mac平台下利用Xcode集成开发环境).如下图: 一.简单分析一下C语言程序的开发步骤. 由上图我们可以看出C语言由 ...

最新文章

  1. 【网页设计】框架的高度随框架里面的内容的多少而改变——转
  2. openvas 配置遇到的问题
  3. [学习笔记] 七步从Angular.JS菜鸟到专家(3):数据绑定和AJAX [转]
  4. Annotation实战【自定义AbstractProcessor】
  5. asp Upload
  6. RFC1323 timestamp PAWS的实现陷阱
  7. 美国节点服务器有什么优势,美国CN2服务器的概念与优势
  8. ARM汇编语言指令集汇总
  9. python卸载库命令_python常用删除库的方法
  10. 游戏策划——游戏的分类
  11. 转自登峰之群:晓军教材(一)
  12. 导数、偏导数、梯度、方向导数、梯度下降、二阶导数、二阶方向导数
  13. 网络安全学习和CTF必不可少的一些网站
  14. 如何重设思科路由器密码并保持配置不丢失?
  15. RGB TFT-LCD彩条显示实验
  16. JS 异步编程的解决方案,以及回调地狱的解决方案
  17. 以太坊系列 - 以太坊硬分叉和升级足迹
  18. chm editor 打包html,CHM Editor(反编译HTML帮助文件)
  19. win7环境下 net start npf服务名无效的解决方法。
  20. 镜像网络MW测试网上线一周年精彩回顾

热门文章

  1. android float 百分比,如何在android中计算百分比
  2. 学习笔记96—WIN7/WIN8/WIN10 安装 MSDE SQL2000 卡住不动的解决办法
  3. 搜狗收录方法之搜狗推送接口实现
  4. 微信小程序开发 uniapp【bug修复】点击事件 传值 数据结构错误 $orig
  5. 本科计算机考研考英语,2016考研必需知道的10件事
  6. html添加鼠标右键菜单,Fabric.js - 添加鼠标右键点击事件响应(附:右键菜单)...
  7. G-Biosciences Tube-O-DIALYZER系列透析管方案
  8. (附源码)node.js外卖平台 毕业设计 151448
  9. python布尔类型运算_Python3 布尔类型
  10. 再次哀悼吧!最佳夸浏览器同步 Xmarks 宣布终止服务