Cpp

アーキテクチャx86_64エラーのシンボルが重複しています



Duplicate Symbols Architecture X86_64 Error



私のコンパイラはclion(xcodeの環境に基づく)であり、システムはmacであり、このエラーは最初にクラスを作成したときに発生しました。

// // 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 { //Implicit inline function return bookNo } Sales_data& combine(const Sales_data& ) double avg_price() const //Constant member function 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 // This is the corresponding .c++ file #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 }

表示されるエラーは次のとおりです。



重複するsymbol__Z4readRNSt3__113basic_istreamIcNS_11char_traitsIcEEEER10Sales_data:
CMakeFiles / untitled1.dir / main.cpp.o
CMakeFiles / untitled1.dir / Sales_data.c ++。または
重複するシンボル__Z5printRNSt3__113basic_ostreamIcNS_11char_traitsIcEEEERK10Sales_data:
CMakeFiles / untitled1.dir / main.cpp.o
CMakeFiles / untitled1.dir / Sales_data.c ++。または
重複する記号 _Z3addRK10Sales_dataS1 に:
CMakeFiles / untitled1.dir / main.cpp.o
CMakeFiles / untitled1.dir / Sales_data.c ++。または
ld:アーキテクチャx86_64の3つの重複するシンボル
clang:エラー:リンカーコマンドが終了コード1で失敗しました(呼び出しを確認するには-vを使用してください)
make [3]: * [untitled1]エラー1
make [2]: * [CMakeFiles / untitled1.dir / all]エラー2
make [1]: * [CMakeFiles / untitled1.dir / rule]エラー2
作る: * [untitled1]エラー2

次に、.oファイルのエラーがコンパイル中に間違いなく問題であることがわかりました。問題を突き止めた後、私は本の中で言ったことを言いたいと思います。
以前、第3章に内容があったことがわかりました。関数は何度も宣言でき、ファイル間でも宣言できますが、定義できるのは1回だけです。そうしないと、繰り返し定義をコンパイルできないため、.hである必要があります。ファイルに問題があります。フレンド関数の定義を.c ++ファイルに移動して、問題を解決します