duplicate symbols for architecture x86_64エラー
4390 ワード
私のコンパイラはclion(xcodeの中の環境に基づいて)、システムはmacで、初めてクラスを書く時この間違いが現れました
エラーは次のとおりです.
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ファイルエラーはコンパイル時の問題に違いない.問題を特定した後、すぐに本に何と言いたいのかを発見した.前の第3章には、関数は何度も宣言したり、ファイルにまたがって宣言したりすることができるが、一度しか定義できない.そうしないと、繰り返し定義はコンパイルできないので、間違いない.hファイルに問題が発生しました.友元関数の定義を移動します.c++ファイルで問題が解決しました
//
// Created by apple on 2018/5/13.
//
#ifndef C_PRIMERPLUS_SALES_DATA_H
#define C_PRIMERPLUS_SALES_DATA_H
#include
//#include
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ファイルエラーはコンパイル時の問題に違いない.問題を特定した後、すぐに本に何と言いたいのかを発見した.前の第3章には、関数は何度も宣言したり、ファイルにまたがって宣言したりすることができるが、一度しか定義できない.そうしないと、繰り返し定義はコンパイルできないので、間違いない.hファイルに問題が発生しました.友元関数の定義を移動します.c++ファイルで問題が解決しました