スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Makefileと暗黙のルール

GNU make + gcc/g++でプログラムをコンパイルする際、-lm とか -lOpenCL とかの追加ライブラリの 指定を、自分で書いたソースやオブジェクトよりもコマンドラインの後ろに書かないとリンクしてくれないことがある。

これは、gcc/g++はコマンドラインで指定されたオブジェクトファイルを前から順に見ていき、前のファイルに出てきた未解決参照を後ろのファイルで解決する、という動作になっているためだ。

リンカオプションだから、Makeの組み込み変数ではLDFLAGSに-lOpenCLと入れればいいかと思ったら、GNU makeの暗黙のルールではLDFLAGSはオブジェクトファイルの指定より前に来るようなので、上記の理由によりリンクエラーになってしまう。

GNU makeのマニュアルwww.gnu.org/s/make/manual/make.html#Catalogue-of-Rulesによれば、LDLIBSという組み込み変数はコマンドラインの一番後ろ("-o 出力ファイル" の直前)に挿入されるようなので、どうやらこの変数を使えばうまくいくようだ。

結局、なるべく暗黙のルールを効率的に使用するには、g++を使用する場合、

CPPFLAGS = -I$(HOME)/include -I/usr/local/cuda/include
CXXFLAGS = -g
LDFLAGS  = -L$(HOME)/lib -L/usr/local/cuda/lib64
LDLIBS   = -lmyCLManager -lOpenCL
TARGET = test1

all: $(TARGET)

$(TARGET): test1.cpp sub1.cpp sub2.cpp

のようにしておけば、オブジェクトや実行ファイル生成のルールは暗黙のルールをそのまま使用して簡潔に書けることがわかった。gccの場合はCXXFLAGSの代わりにCFLAGSを使えば良い。

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

GM3D

Author:GM3D
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。