プロが教える店舗&オフィスのセキュリティ対策術

main.c sub1.c sub2.cに対して
共有ライブラリlibsub1.soとlibsub2.soを生成して
それをもちいてmainをコンパイルするMakefileを以下のように記述しました。

CC=gcc
LIB=
CFLAGS=-Wall
TARGET = main
SHAD = -shared
.SUFFIXES:.so .o
SRCS = main.c libsub1.so libsub2.so

$(TARGET):$(SRCS)
$(CC) -o $@ $(SRCS)
@echo "make finished!!"

#.o.so:
#$(CC) $(SHAD) -o $@ $<

libsub1.so:sub1.o
gcc -shared -o libsub1.so sub1.o

libsub2.so:sub2.o
gcc -shared -o libsub2.so sub2.o

.c.o:
$(CC) -c $<

#sub1.o:sub1.c
#gcc -c -fPIC sub1.c

#sub2.o:sub2.c
#gcc -c -fPIC sub2.c

clean:
@rm -f libsub?.so sub?.o

ここで.oから.cを生成するのはサフィックスでできたのですが、同じように.oから.soを生成するのは
できませんでした。

#.o.so:
#$(CC) $(SHAD) -o $@ $<

ここはどのように記述したらいいのでしょうか?
回答お願いします。

A 回答 (3件)

このように書けばできなくはないですが、No.2の方が指摘されているように、


ライブラリとオブジェクトが1:1とは限らないのできっちりルールを書かれた方が
よいように思います。

lib%.so: %.o
    $(CC) $(SHAD) -o $@ $<

もしくは、Makefileをそのままにして、ソースのファイル名を sub1.c、sub2.cではなく、
libsub1.c、libsub2.cとする。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。助かりました。

お礼日時:2011/11/01 15:20

> libsub1.so:sub1.o


> gcc -shared -o libsub1.so sub1.o

サフィックスルールならファイル名が対応してないと駄目です。要は libsub1.so なら libsub1.c に対応するみたいな。

%ルールとかは使えると思う。

ただライブラリにするくらいだとオブジェクト一つということは無いだろうし、無理に省略することもないかと。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。助かりました。

お礼日時:2011/11/01 15:19

サフィックスルールはサフィックスが変わるルールしか書けないのでできません。


libsub1.so, libsub2.so が sub1.so, sub2.soでよければ書けますけど。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。助かりました。

お礼日時:2011/11/01 15:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!