C++ 编译错误:ld: 4 duplicate symbols for architecture x86_64

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 错误,还不太清楚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值