2017-03-17 18 views
0

私は1つのプログラムを持っており、静的ライブラリまたは共有ライブラリを使用しています。今私は2つの場合にプロジェクトをコンパイルする1つのコードから複数のプロジェクトを1つのメイクファイルに作成する

make static 

または

make shared 

のような何かをしたいです。 私のMakefileが

shared: main.o libresult.so 
     gcc -o shared main.o -L. -lresult -Wl,-rpath,. 

main.o: main.c 
     gcc -c main.c 

libresult.so: func.o 
     gcc -shared -o libresult.so func.o 

func.o: func.c 
     gcc -c -fPIC func.c 

static: main.o libresult.a 
     gcc -o static main.o -L. -lresult 

main.o: main.c 
     gcc -c main.c 

libresult.a: func.o 
     ar cr libresult.a func.o 

func.o: func.c 
     gcc -c func.c 

clean: 
     rm -f *.o *.a *.so static shared 

のように見えるコースオフ、端末はいくつかの警告を与えます。それはうまく動作しますが、私は考えていません 非常に美しいです:)。それをより良くするには?

main.o: main.c 
    gcc -c main.c 

はそれらのいずれかの削除:

+0

代替案を提供するには、シェルスクリプトによって提供される切り替えメカニズムを使用して、プロジェクトごとに別々のメイクファイルを作成する方が理にかなっていると思います。シェルスクリプトをフロントエンドとしてMakeを使用することは、多くの機能を提供し、異なるアーキテクチャー、オペレーティングシステムの定義とインクルードなどの追加フラグを設定するために 'configure'スクリプトがどのように機能するかと似ています。 './build a'と' ./build b'、 './build clean'などです。 – Zhro

答えて

1

1)あなたはmain.oルールの2つのコピーを持っています。

func.o: func.c 
    gcc -c -fPIC func.c 

func.o: func.c 
    gcc -c func.c 

これは、より深刻な問題である:

2)あなたはfunc.oルールの2つのバージョンがあります。共有ライブラリに入れたオブジェクト(libresult.so)は、-fPICでコンパイルする必要があります。静的ライブラリに入れたオブジェクト(libresult.a-fPICでコンパイルされますが、そうする必要はなく、コンパイラのフォームが最適化を実行できなくなる可能性があります。異なる名前を持つオブジェクトの2つのバージョンを作成する方がよいので、あなたの意図を知っていないことを確認してください:

func_so.o: func.c 
    gcc -c -fPIC func.c -o func_so.o 

func_a.o: func.c 
    gcc -c func.c -o func_a.o 

(これらのオブジェクトに依存しているルールを変更することを忘れないでください。)

3)automatic variablesを使用して冗長性を減らし、メイクファイルをきれいにします。例:

main.o: main.c 
    gcc -c $< -o [email protected] 

さらに快適性が向上すると、さらに改善が可能です。

関連する問題