2011-12-04 18 views
1

PostgreSQLのストレージマネージャモジュールにいくつかの機能を追加しようとしています。 私はすでにsmgrフォルダにいくつかのソースファイルを追加しました。そして、Makeシステムに、その名前をsmgrフォルダ内のMakefileのOBJSリストに追加することでそれらを組み込むことができました。 (つまり、A.cを追加すると、A.oをOBJSリストに追加します)。Makefileを使ってPostgresqlに新しいソースコードファイルを追加する

正常に動作していました。今私は新しいファイルhdfs_test.cをプロジェクトに追加しようとしています。このファイルの問題は、コンパイルコマンド(-Iおよび-Lディレクティブ)にいくつかのディレクティブが必要であることです。

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

gcc hdfs_test.c -I/HDFS_HOME/hdfs/src/c++/libhdfs -I/usr/lib/jvm/default-java/include -L/HDFS_HOME/hdfs/src/c++/libhdfs -L/HDFS_HOME/build/c++/Linux-i386-32/lib -L/usr/lib/jvm/default-java/jre/lib/i386/server -ljvm -lhdfs -o hdfs_test 

したがって、単にOBJSリストにhdfs_test.oを追加することはできません。 私はこのように見えるようにMakefileを編集してみました:

OBJS = md.o smgr.o smgrtype.o A.o B.o hdfs_test.o 

MyRule1 : hdfs_test.c 
gcc tati.c -c -I/diskless/taljab1/Workspace/HDFS_Append/hdfs/src/c++/libhdfs -I/usr/lib/jvm/default-java/include -L/diskless/taljab1/Workspace/HDFS_Append/hdfs/src/c++/libhdfs -L/diskless/taljab1/Workspace/HDFS_Append/build/c++/Linux-i386-32/lib -L/usr/lib/jvm/default-java/jre/lib/i386/server -ljvm -lhdfs 

それがうまくいかなかった、と私はディレクティブを含めずにhdfs_test.cをコンパイルしようとしているメイクのエラーメッセージが出続けました。

hdfs_test.cのコンパイルディレクティブを含めるにはどうすればよいですか?

おかげ

答えて

2

あなただけのリンク時に、コンパイル時に-l-Lを渡す必要はありません。コンパイル時には、コンパイラが余分なヘッダを見つけるのを助けるために、-I(パスを含む)ディレクティブのみが必要です。

ソースファイルを他のすべてと同じように.oファイルにコンパイルする必要があります。次に、リンカーを呼び出してpostgres実行可能ファイルを作成するときに、-L-lディレクティブをリンクコマンドラインに追加します。これは、すでに完了しているように、src/backend/storage/smgr/Makefileで編集する必要があるすべてがOBJSの出力オブジェクトを追加する行であることを意味します。カスタムルールを削除すると、間違っているだけでなく不必要になります。

余分なライブラリを$(LIBS)変数に追加し、-Lパスを$(LDFLAGS)src/Makefile.globalで追加してください。 src/Makefile.globalconfigureからsrc/Makefile.global.inまで生成されますので、インクルード、ライブラリパス、ライブラリを追加するには、実際にconfigureの動作を変更する必要があります。 configureを直接編集しないでください。 configure.inを編集し、autoconfで再生成してください。

はい、GNU Autotoolsは、理由によってautohellと呼ばれることがあります。面白いこともあります。時にはうまくやることができます。単純なことをすることには間接的なやり方がたくさんあります。

+0

こんにちはクレイグ..もう少し詳しくお聞かせください。 まず、余分なインクルードフォルダを$(LIBS)に追加するにはどうすればよいですか? LIBS =/IncludeFolder1:/ IncludeFolder2を内側のメークファイル(フォルダsmgr内のファイル)内に作成できますか? Makefile.global.inもチェックして、LDFLAGSにリンクフォルダを追加する場所を正確にはわかりませんでした。 は、例えば、私はこれが見つかりました: のifdef PGXS LDFLAGS = -L $(LIBDIR) 他 LDFLAGS = -L $(top_builddir)/ SRC /ポート endifの LDFLAGSを+ =が が、私はこの後に追加することはでき@LDFLAGS: LDFLAGS + =/LinkFolder1そしてLDFLAGS + =/LinkFolder2? その後、autoconfはどのように使用しますか? ありがとう – Ticker23

+0

OBJSにファイルを追加する以外は、Makefileを直接操作しないでください。作成した 'Makefile'に' configure'を追加して$(LIBS)を修正してください。 autoconfの詳細については、多くのチュートリアルとドキュメンテーションの1つを見ることをお勧めします。 基本的には、自動作成と作業の仕方を学ぶ必要があります。それは私がStackOverflowコメントで教えることができるものではありません。チュートリアルを参照してください。 –

+0

また、内部makefileから 'LIBS'に追加することはできません。なぜなら、再帰的makeは変数の変更を呼び出しツリーにバックアップして伝播しないからです。 'postgres'のリンカが呼ばれている' Makefile'からやるべきです - より良い方法は 'configure 'を' $(LIBS) 'に' Makefile.in'。 –

関連する問題