2009-06-22 8 views
2

既存の長いCソースコードを変更する必要があります。リンカーによって使用されるライブラリのディレクトリの場所など、さまざまなコンパイラオプションを定義するトップレベルのMakefileがあります。MakefileからCプログラムに変数をインポートする

ような何か:

LD_OPTIONS = $(PATH_TO_MYLIB1) $(PATH_TO_MYLIB2) 

、私はこれらのライブラリを使用するためにdlsym()dlopen()を使用しての代わりに、明示的にリンクを考えています。このためには、私はライブラリのパスが必要です。

dlopen(path_to_lib , RTLD_NOW) ; 

変数をMakefileからどのように使用して自分のプログラムで使用できますか?私は "echosystem()"のようなものを使用することを考えました。しかし、もっと良い解決策があると私は期待しています。あなたのmakefileで:-)

答えて

9

あなたは

CFLAGS += -DPATH_TO_LIB="somepath/somelib" 

を書くことができますので、PATH_TO_LIBはあなたが

dlopen(PATH_TO_LIB, RTLD_NOW); 
4

ようなあなたのソースで使用できるプリプロセッサマクロになり、私はずっとあなたの変化点が表示されませんあなたのパスがとにかくハードコーディングされているなら、私は逃げ出します。おそらく、このような

dlopen(MYLIB_1, RTLD_NOW); 
2

気にいら:makefileで

CFLAGS = -DMYLIB_1=$(PATH_TO_MYLIB1) -DMYLIB_2=$(PATH_TO_MYLIB2) 

その後、あなたの源泉であなたは、このような何かを行うことができますか?あなたのコード

#ifndef PATH_TO_LIB 
#error Path to ImportantLib missing 
#endif ... 

など 見えるかもしれませんコンパイルコマンドで

cc -DPATH_TO_LIB=\"${PATH_TO_LIB}\" 
+0

は、あなたがそのようなことをやろうとしている場合は、それが#warningを行うには、おそらく良いでしょうか#ifndefブロック内の#errorは、実行時に破損する任意の値に割り当てるのではなく(恐らく、dlopen()がいつ呼び出されるかは分かりません) –

+0

正しい。 – Nifle

+1

"ifndef ... error"というものが本当に必要です。マクロが定義されていないと、 "unresolved symbol PATH_TO_LIB"リンカーエラーが表示されます。 – qrdl

関連する問題