2016-07-29 3 views
0

私はarpackppインターフェイスで作業しています。ライブラリ全体は.h個のファイルで記述されているため、ライブラリをコンパイルする必要はありません。"多重定義の..." arpackppを使用して私の現在のプロジェクトで

/.../Files/Includes/:私はmain.cpp、私は次のエラーを取得していない私のファイルは、いくつかの中arpackppヘッダファイルの一部が含まれている場合 - 私が今直面してる問題../../../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:いくつかのarpackppため

ArpackError::code' /.../Files/Includes/../../../arpack++/include/arerror.h:163: first defined here /tmp/ccruWhMn.o: In functionのstd ::ベクトル> ::のmax_size()constは「複数の定義.oすべてのファイルをリンクするときに機能します。私がいくつかのスレッドを読んだので、実際には関数のインスタンス化が含まれていて、通常は避けるべきです。 私はライブラリ全体を変更したくないので、arpackppクラスを使ってすべてのクラスと関数を含めました。main.cppのクラスは非常に面倒です。この問題の回避策はありますか?そして、なぜ警備員は含まれていません(#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にアクセスするために必要な機能にすべてのコードを分離するだけの簡単な作業になります。次に、それらをすべて1つの*.cppファイルに含め、*.oとリンクにコンパイルします。

+0

答えをありがとう。私のファイルをhppに変更すると助けになりました。私が直面する不都合なのは、私のmakeファイルが自分の* .hppファイル内のチャンスを認識しないことだけです。 – dimmigen

+0

あなたの2番目の提案は私のためには機能しませんでした。 config.hppをインクルードすると、前と同じエラーメッセージが出ます。 config.hppのみを含む場合の違いは何ですか? – dimmigen

+0

@dimmigen arpackライブラリのみを使用する多くの関数があるとします。それらの全てを 'some.c'ファイル' #include "arpack"に '' some.c'ファイルだけを入れ、対応する 'some.h'ファイルには入れません。これは基本的に、ヘッダベースの関数を一度しか使用していないことを意味します。 – silvergasp

0

まず、ガードは、プロジェクトファイルの依存関係グラフの「サブツリー」にヘッダが複数含まれることを防ぐため、この時点でガードを含めないでください。言い換えると、同じプロジェクトの2つの完全に分離されたファイルにヘッダーを含めると、C++プリプロセッサは#include <header.h>をヘッダーで指定されたコードで2回独立に置き換えます。ヘッダーにのみ宣言が含まれている限り、これは完全に問題ありません。

あなたの場合(および他の多くのヘッダーのみのライブラリの場合)、ヘッダーにも定義が用意されています。残念ながら(私が知る限りでは)、定義ファイルをプロジェクトに一度含める以外の方法はありません。 https://github.com/m-reuter/arpackpp/blob/master/include/READMEは、どのファイルに定義が含まれているかを明示します。

ただし、一部のライブラリでは、提供されたヘッダーファイル(例:https://github.com/nothings/stb)の定義を含めるプリプロセッサマクロが用意されています。たぶんarpackppも同様のメカニズムを提供します。

+0

答えをありがとう。 arkcppでarpackppを意味しましたか?あるいは、これは別のcppライブラリの名前ですか?速いGoogleの調査では、このトピックに関連するものは何も出てこなかった。 – dimmigen

+0

申し訳ありません、ちょうどタイプミスです。もちろん私はarpackppを意味します:)。私は私の答えのタイプミスを修正します。 –

関連する問題