duplicate symbols : 网上查询解决方法,大多数说是把.cpp当做头文件include进来了,这种情况确实会引起 duplicate symbols 错误,但是也要注意,除了这种情况,还有下面这种情况也会引起:
假设一个C++项目有4个文件,分别是 a.h, b.h, b.cpp, main.cpp
a.h 头文件声明并定义了类以及其成员;
b.h 导入了a.h,且b.cpp中实现了b.h中声明的类及其成员函数;
main.cpp 导入 b.h;
(1)在使用命令 g++ main.cpp b.cpp -o main -std=c++2a 的时候,也会出现 duplicate symbols 错误,解决办法就是新建一个a.cpp,将a.h中只放类的声明,类成员函数的实现放在a.cpp中,这样再用命令
g++ main.cpp b.cpp a.cpp -o main -std=c++2a
就没有duplicate symbols 错误了。
(2)不进行(1)中所示修改,先把b.cpp编译成动态库:
g++ -shared b.cpp -o b.so -std=c++2a
然后使用 b.so 与 main.cpp 一同编译:
g++ mian.cpp b.so -o main -std=c++2a
也可以正常编译完成,生成可运行的程序,这种情况为什么可以规避上述 duplicate symbols 错误,还不太清楚。