2012-05-03 64 views
1

我目前正試圖編譯一個現有的項目,它是cpp和c的混合體。C/C++重複符號錯誤

我的makefile如下;

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 

而我主要是一個相當普通

// 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; 
} 

如果是註釋掉的#include 「cit.cpp」 它編譯罰款。但是,如果我包含它會發生以下錯誤;

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文件包含一些結構和一些宏。

+3

你爲什麼包含'cit.cpp',這是我假設的一個實現文件?你能告訴我們那個文件嗎?你可以一起編譯這些文件。 – birryree

回答

4

cit.cpp是由本身編譯,也包括在main.cpp所以你要在它所有的代碼兩個副本。

+0

我有點想現在刪除這個問題。謝謝 - 因此習慣於在我的主要內容中包含至少一些內容(即標題)。 – Alex

3

沒有必要

​​

cit.cpp被編譯爲一個獨立的單元,後來聯繫。

對於上述包括你的結果得到的代碼兩次重複的符號

2

您正在編譯cit.cpp以產生cit.o,並且您正在使用您的main.cpp中的#include "cit.cpp" attrocity編譯它。所以當然你會得到重複的符號。