2016-11-10 12 views
0

src/のサブディレクトリに定義されている関数を参照するC++ファイルがあります。 g ++を使ってサブディレクトリ内にcppファイルを指定する方法はありますか? ***ヘッダファイルに事前に宣言されている関数を定義するソースファイルを指定します。

# SeqLib 
# |----src 
# |-----|---Makevars 
# |-----|---rcpp_hello_world.cpp 
# |-----|---SeqLib(a submodule) 
# |-----|------|---SeqLib 
# |-----|------|---FermiAssembler.h 
# |-----|------|---src 
# |-----|------|---|----FermiAssembler.cpp 

************************* EDIT:ここ

は、パッケージの構造であり、 ***********

-I../src/SeqLib/を実行すると、エラーundefined symbol: _ZN6SeqLib14FermiAssemblerD1Evが表示されます。 C++ filtを使用すると、シンボルはFermiAssembler.hで宣言されたデストラクタを参照しますが、FermiAssembler.cppで定義されます。

+0

あなたは '-I'オプションを持っています。コードのために、あなたはリンカを持っています... –

+0

返信ありがとうございます。 '-I'でインクルードを指定すると、rcpp_hello_world.cppのFermiAssemblerを#include" SeqLib/FermiAssembler.h "または" SeqLib/FermiAssembler.cpp "で参照することができます – Crt

+0

他の' .cpp'ファイルは含まれていません! includeディレクティブで正しい相対パスを渡す場合、構造体ではオプションは必要ありません。何らかの理由で –

答えて

3

すべての.cppファイルをコンパイラコマンドに渡す必要があります。他の.cppファイルに.cpp個のファイルを含めることを強くお勧めします。あなたのために働く可能性があり

コマンドラインは次のとおりです。

g++ -ISeqLib -o my_executable rcpp_hello_world.cpp SeqLib/src/FermiAssembler.cpp 

あなたはたくさんのファイルを持っている場合は、すべてのコードを毎回再コンパイルを避けるために、メイクファイルのスクリプトを作成することをお勧めします。

FermiAssembler製品にMakefile.am/inファイルが含まれている場合は、おそらくここにあるconfigureスクリプトを使用してそれ自身を構築できます。一般的な考え方は次のとおりです。それは、ライブラリ製品の場合

cd SeqLib 
./configure 
make 

、それは.aまたは.soファイルとして作成します。その場合には、コマンドラインは次のようになります。

g++ -ISeqLib -o my_executable rcpp_hello_world.cpp SeqLib/bin/FermiAssembler.a 

(私は、出力ライブラリ・ファイルのパス&名前をgessingよ)

ちょうど彼らのパスを追加し、そこから.Aファイルを含めるには。 lib依存関係はアルファベット順に従わないので、SeqLib/bin/*.aがそれを行うとは確信していません。仕事と非常にブルートフォース事は(それほど間libの依存関係がうまくいく)を2回すべて.aのファイルを指定することになります。

g++ -ISeqLib -o my_executable rcpp_hello_world.cpp SeqLib/bin/*.a SeqLib/bin/*.a 

それは、しかし、良いだろう尊重し、唯一必要な.aファイルをインクルードします次の注文:最初は次のものに依存します。最後のライブラリは、前のライブラリに依存してはいけません。

+0

gotcha。試してみる。約10個のファイルがありますが、興味深いことに、サブモジュールには独自の 'Makefile.am'と' Makefile.in'があります。これらの10個のcppファイルをg ++で実行せずに呼び出すことは可能ですか?私はコードをコンパイルするだけなので、それはrcpp_hello_world.cppに参照可能にしないので、いいえと思います。 – Crt

+0

'my_executable'は何ですか? '。/ configure'と' make'を実行した後、複数の '.a'ファイルで' bin/'フォルダが出力されました。私は '-L ../ src/SeqLib/bin /'を使ってそれらのパスを指定しました。それを指定する正しい方法ですか? – Crt

+0

'my_executable'はあなたの実行可能ファイルです(名前は好きです)。 'configure'コマンドがうまくいきました!良い。これで私の編集内容を確認できます。 '-L'でlibパスを指定し、' -lname'で 'libname.a'を参照することもできます。 –

関連する問題