2016-07-29 76 views
0

我正在使用arpackpp接口。整個庫被寫入.h文件中,因此不需要編譯庫。「多重定義...」在我當前的項目中使用arpackpp

/.../Files/Includes/:當我有一些arpackpp頭文件中的一些我的文件,這是不是main.cpp,我得到了下面的錯誤 - 我現在面臨的問題../../../arpack++/include/arerror.h:163:多重定義ArpackError::Set(ArpackError::ErrorCode, std::string const&)' /.../Files/Includes/../../../arpack++/include/arerror.h:163: first defined here /tmp/ccruWhMn.o: In function std :: iterator_traits :: iterator_category std :: __ iterator_category(char * const &)': /.../Files/包括/../../../ ARPACK ++ /包含/ arerror.h:163:ArpackError::code' /.../Files/Includes/../../../arpack++/include/arerror.h:163: first defined here /tmp/ccruWhMn.o: In function的std ::矢量> :: MAX_SIZE()const的'的多個定義:

arpackpp鏈接所有.o文件時起作用。正如我在幾個線程中看到的,問題是我實際上包含了函數的實例化,通常應該避免這些實例化。 因爲我不想更改整個圖書館,所以我在main.cpp中使用arpackpp類包含所有類和函數,這些類變得非常混亂。有沒有解決這個問題的方法?爲什麼不包括警衛(#ifndef...#endif)防止這個問題?

+0

你能否詳細說明你的錯誤......「多重定義......」可能意味着很多事情?你可以通過編輯你的問題來做到這一點。 – silvergasp

回答

0

通常,使用僅標題庫的最簡單方法是僅使用標題擴展代碼。如果您使用正確的標頭警衛,這將消除您的代碼的多個定義的問題。如果您有大量現有代碼,那麼我建議您將所有*.cpp文件重命名爲*.hpp(C++頭文件),然後添加合適的標頭警衛。此外,處理此基礎代碼的一種便捷方式是創建一個附加頭文件config.hpp並在該文件中包含所有其他頭文件。然後在你的main.c中,包含config.hpp文件是一件簡單的事情。

例如

// Config.hpp ------------------------------------------------= 
#include "example.hpp" 
#include "example1.hpp" 
#include "example2.hpp" 
// etc. 

// main.cpp --------------------------------------------------= 
#include "Config.hpp" 

int main() { 
    // Your code here. 
    return 0; 
} 

此外,如果你想與你的項目結構,以繼續它會分離所有的代碼到需要直接訪問arpackcpp功能的一個簡單的事情。然後將它們全部放入一個*.cpp文件中,並編譯成*.o和鏈接。

+0

感謝您的回答。將我的文件更改爲hpp確實有幫助。我唯一面臨的\t不便之處在於我的make文件不會在我的* .hpp文件中識別出任何機會。 – dimmigen

+0

您的第二個建議對我無效。在包含config.hpp時,我收到了和以前一樣的錯誤消息。你可以向我解釋什麼是僅包含config.hpp時的區別嗎? – dimmigen

+0

@dimmigen假設你有許多隻使用arpack庫的函數。如果你把所有這些文件放在'some.c'文件中'#include「arpack」'只在'some.c'文件中,而不是在相應的'some.h'文件中。這基本上意味着你只使用基於頭的函數一次。 – silvergasp

0

首先,包括警衛在這一點上沒有幫助,因爲他們只是防止項目文件依賴圖的「子樹」中包含多個頭文件。換句話說:如果在同一項目的兩個完全分離的文件中包含一個頭文件,C++預處理程序將用標頭中指定的代碼兩次取代#include <header.h>。只要頭只包含聲明,這就完全正常了。

在你的情況下(以及許多其他只有標題的庫),定義也在標題中提供。所以不幸的是(據我所知),除了在你的項目中包含含有定義的文件之外,沒有其他方法可行。 https://github.com/m-reuter/arpackpp/blob/master/include/README明確指出哪些文件包含定義。

但是,某些庫提供預處理器宏來觸發所提供頭文件的定義(例如https://github.com/nothings/stb)。也許arpackpp提供了類似的機制。

+0

感謝您的回答。用arkcpp你的意思是arpackpp?或者這是不同的cpp庫的名稱?谷歌的一項快速調查並未涉及與該主題相關的任何內容。 – dimmigen

+0

對不起,只是一個錯字。當然,我的意思是arpackpp :)。我會在我的回答中糾正錯字。 –

相關問題