C解决duplicate symbol

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 copy到源文件内。每个cpp文件被编译成.o文件,然后相同的方法声明导致冲突。

解决方法:

  1. 将duplicate symbol的method,声明为inline
    • Inline functions are actual functions whose copy of the function body are injected directly into each place the function is called.
    • inline 方法的方法体,会被直接copy到 方法调用的地方。(所以可以说,没有这个方法,即没有这个symbol,自然不会 duplicate symbol了)
  2. 采用宏定义#define LOG(s) (std::cout << s << std::endl),相当于不是方法了,就是文本替换了。
  3. 将方法声明为static(表示方法不能被share,生成的symbol只在文件内可见)

参考文档

C解决duplicate symbolC解决duplicate symbol 鸡蛋卷啊卷 发布了183 篇原创文章 · 获赞 31 · 访问量 25万+ 私信 关注
上一篇:MySQL INSERT ON DUPLICATE KEY UPDATE


下一篇:ON DUPLICATE KEY主键重复