2012-05-03 14 views
1

現在、私は現在cppとcが混在している既存のプロジェクトをコンパイルしようとしています。C/C++重複したシンボルエラー

私のメイクファイルは次のとおりです。

execute: mgnsvd.o multifit.o cit.o main.o 
    g++ -Wall -g multifit.o cit.o main.o mgnsvd.o -lgsl -lgslcblas -o execute 

main.o: main.cpp cit.cpp 
    g++ -Wall -g -c main.cpp 

cit.o: cit.cpp mgnsvd.c multifit.h 
    g++ -Wall -g -c cit.cpp 

multifit.o: multifit.c mgnsvd.c multifit.h 
    g++ -Wall -g -c multifit.c 

mgnsvd.o: mgnsvd.c 
    g++ -Wall -g -c mgnsvd.c 

そして、私のメインの#include "cit.cpp" をコメントアウトし、それがうまくコンパイルであれば、むしろ平野

// global libraries 
#include <iostream> 

// local files 
#include "cit.cpp" 

// using directives 
using std::endl; 
using std::cout; 

// main 
int main(){ 

    cout << "Hello, world" << endl; 

return 0; 
} 

です。しかし、私はそれを含めると、次のエラーが発生します。

ld: duplicate symbol _first_function_in_cit in main.o and cit.o for architecture x86_64 

_first_functionは、常に最初の関数であり、定義された、あるいは他の場所で使用/宣言されていません。オブジェクトファイルのgrepは、その関数がmain.oに組み込まれているようだが、それはなぜですか?私は以前にC++/Cプロジェクトに取り組んでいませんでしたので、いくつかの標準エラーが出ていますか?私はOSXにもあります。

レコードの場合、クラスはありません。.hファイルにはいくつかの構造体といくつかのマクロが含まれています。

​​

cit.cppの必要はありません

+3

なぜあなたは 'cit.cpp'を含んでいますか?私は実装ファイルを前提としていますか?あなたはそのファイルを見せてくれますか?ファイルを一緒にコンパイルすることができます。 – birryree

答えて

4

cit.cppに結果を二度コードを取得し、また、あなたがその中のすべてのコードの2つのコピーを取得しているmain.cppに含まれています。

+0

私は今この問題を削除したいと思います。ありがとうございます - 私はメイン(ヘッダー)に少なくとも何かを含めるのに慣れていました。 – Alex

3

は、別々のユニットとしてコンパイルし、後でリンクされています。以上により

は、あなたが自分自身でコンパイルされている重複したシンボル

2

あなたはcit.cをコンパイルしてcit.oを生成しています。あなたはmain.cppにその#include "cit.cpp"のアトロシティを付けてコンパイルしています。もちろん、シンボルは重複しています。

関連する問題