duplicate symbols for architecture x86_64 错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TailorWu/article/details/80317448

我的编译器是clion(基于xcode里面的环境),系统是mac,第一次写类的时候出现了这个错误


//
// Created by apple on 2018/5/13.
//

#ifndef C_PRIMERPLUS_SALES_DATA_H
#define C_PRIMERPLUS_SALES_DATA_H

#include <iostream>
//#include <string>
using namespace std;
class Sales_data {
private:
    string bookNo;
    unsigned units_sold;
    double revenue;
public:
    string isbn() const {  //隐式的inline函数
        return bookNo;
    }
    Sales_data& combine(const Sales_data& );
    double avg_price() const; //常量成员函数

    friend Sales_data add(const Sales_data& ,const Sales_data&);
    friend ostream& print(ostream& , const Sales_data&);
    friend istream& read(istream &is,Sales_data &item);

};
Sales_data add(const Sales_data &lhs,const Sales_data &rhs){
    Sales_data sum = lhs;
    sum.combine(rhs);
    return sum;
}
ostream& print(ostream& os, const Sales_data& item){
    os << item.isbn() << " " << item.units_sold << " "
       << item.revenue << " " << item.avg_price();
    return os;
}
istream& read(istream &is,Sales_data &item){
    double price = 0.0;
    is >> item.bookNo >> item.units_sold >> price;
    item.revenue = price * item.units_sold;
    return is;
}


#endif //C_PRIMERPLUS_SALES_DATA_H
// 这是对应的.c++文件
#include "Sales_data.h"

Sales_data& Sales_data::combine(const Sales_data &rhs) {
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;
}
double Sales_data::avg_price() const {
    return revenue/units_sold;
}

出现的错误如下:

duplicate symbol__Z4readRNSt3__113basic_istreamIcNS_11char_traitsIcEEEER10Sales_data in:
CMakeFiles/untitled1.dir/main.cpp.o
CMakeFiles/untitled1.dir/Sales_data.c++.o
duplicate symbol __Z5printRNSt3__113basic_ostreamIcNS_11char_traitsIcEEEERK10Sales_data in:
CMakeFiles/untitled1.dir/main.cpp.o
CMakeFiles/untitled1.dir/Sales_data.c++.o
duplicate symbol _Z3addRK10Sales_dataS1 in:
CMakeFiles/untitled1.dir/main.cpp.o
CMakeFiles/untitled1.dir/Sales_data.c++.o
ld: 3 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: * [untitled1] Error 1
make[2]: * [CMakeFiles/untitled1.dir/all] Error 2
make[1]: * [CMakeFiles/untitled1.dir/rule] Error 2
make: * [untitled1] Error 2

然后我就发现了.o文件出错肯定是编译的时候问题,定位问题之后立即想下书上怎么说的来着
发现之前第三章有个内容是说:函数可以声明很多次,也可以跨文件声明,但是只能定义一次,不然重复定义无法编译,所以肯定是.h文件出问题了,把友元函数的定义移到.c++文件下就解决问题了

猜你喜欢

转载自blog.csdn.net/TailorWu/article/details/80317448