Context
- 在HeaderFile.h头文件了声明一个 LOG() 方法
void LOG(std::string s) { std::cout << s << std::endl; }
- 在SourceFile1.cpp里 #include “HeaderFile.h”
- 在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文件,然后相同的方法声明导致冲突。
解决方法:
- 将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了)
- 采用宏定义
#define LOG(s) (std::cout << s << std::endl)
,相当于不是方法了,就是文本替换了。 - 将方法声明为static(表示方法不能被share,生成的symbol只在文件内可见)