2013-01-06 262 views
2

我創建了一個簡單的使用靜態庫的拼寫檢查程序,因爲我希望其他人能夠使用拼寫檢查功能。這兩個問題區域位於庫源代碼和庫頭中。當我編譯庫時,這是我得到的錯誤:C++靜態庫鏈接器錯誤

ar -cvq libspellcheck.a checker.o 
    a - checker.o 
    g++ -o spell-check main.o meta.o libspellcheck.a 
    libspellcheck.a(checker.o): In function `check_spelling(char*, char*)': 
    checker.cpp:(.text+0x0): multiple definition of `check_spelling(char*, char*)' 
    libspellcheck.a(checker.o):checker.cpp:(.text+0x0): first defined here 
    collect2: ld returned 1 exit status 
    make: *** [spellcheck] Error 1 

checker.cpp代碼位於here。 頭文件(spellcheck.h)位於here

我想知道是什麼導致上述錯誤,因爲我無法弄清楚。

回答

3

看起來好像您已將checker.cpp添加到存檔兩次。

嘗試使用這個命令:

ar -cvr libspellcheck.a checker.o 

使用的r代替q將取代具有相同名稱的現有文件,而不是添加它的另一個副本。

或者,只要確保在向其中添加任何文件之前刪除了存檔,則它始終爲空。

+0

謝謝。你的解決方案完美運作 – Igor

3

問題似乎是連接checker.cpp兩次 - 你可以添加你的makefile(同時確保check_spelling沒有在checker.cpp中定義兩次,並嘗試在構建之前清理中間文件)?

+0

不,你可以從錯誤中清楚地看到兩個版本都在檔案中。在一個翻譯單元中定義一個函數兩次將是一個編譯器錯誤。 –