1

プラグインを使用するようにプログラムを変換しようとしていますが、Makefile に問題があります。Makefile がディレクトリ plugins を調べて、そこで見つかったすべての .c ファイルを 2 つの異なる拡張子 .so と .o で、できれば別のフォルダーにコンパイルします。基本的にこれと同じです:

gcc -shared -lc -o testPugin.so testPugin.o
gcc -c -fpic testPugin.c 
gcc Cprogram.c -ldl 

ただし、不確定な数の .c ファイルの場合。

これまでのところ、プラグイン ディレクトリを調べてすべてのファイルを見つけることができましたが、上記の 2 番目の手順に従ってそれらをコンパイルし、.so ファイルと .o ファイルを出力することに行き詰まっています。これが私がこれまでに持っているものです:

TOP := $(dir $(lastword $(CURDIR)))
PLUGDIR = $(TOP)src/plugins
PLUGSRC = $(PLUGDIR)/*.c
OBJ = $(PLUGSRC:.c=.o)
SRCS = Cprogram.c 
CFLAGS = -shared -lc
BINARY = testProg

$(BINARY): $(SRCS)
    echo $(OBJ)

しかし、それだけで出力されます:

⇒ make
echo /Users/fragmachine/eclipse-workspace/Cprogram/src/plugins/*.o
/Users/fragmachine/eclipse-workspace/Cprogram/src/plugins/*.o

に変更OBJ = $(PLUGSRC:.c=.o)すると、次のようOBJ = $(SRCS:.c=.o)になります。

⇒ make
echo Cprogram.o
Cprogram.o

これは私が望むものの一種ですが、それは1つのファイルのみです。ある種のワイルドカード文字が欠けているに違いないと思いますが、 % と * を使用してみましたが、うまくいきませんでした。

私が何をしようとしているのかはっきりしない場合のために、奇妙な make 疑似コードをいくつか示します。

$(BINARY): $(SRCS)
  gcc -shared -lc $(All plugin.c files) -o $(OBJ) #Output .o files for each plugin.c file
  gcc -shared -lc $(All plugin.c files) -o $(OBJ2) #Output .so files for each plugin.c file
  gcc -c -fpic $(All plugin.c files) # I'm not 100% sure what this does
  gcc Cprogram.c -ldl # Compile the main program

私はまったく経験がありませんmake。以前は本当に簡単なものしか作ったことがないので、どんな助けでも大歓迎です。

4

1 に答える 1

1

ここにあなたが始めるための何かがあります:

PLUGDIR = src/plugins
PLUGSRC = $(PLUGDIR)/*.c
SRCS = $(wildcard $(PLUGSRC))
OBJ = $(SRCS:.c=.o)
SOBJ = $(SRCS:.c=.so)
CFLAGS = -shared -lc
BINARY = testProg

all: $(BINARY)
    @echo "make is fun!"

$(BINARY): $(OBJ) $(SOBJ)
    @echo "build the binary $@ which depends on $^"

%.o: $(SRCS)
    @echo $@

%.so: $(SRCS)
    @echo $@

まず、$(wildcard) 関数を使用して、src/plugins ディレクトリ内のすべての *.c 名を収集します。

次に、すべての .o ファイルと .so ファイルに依存するターゲット all を使用します。

3 番目に、.c ファイルから .so ファイルと .o ファイルを作成するための 2 つのパターン ルールがあります。

ソースへの 4 番目のパスは $(TOP)src/plugins を使用しましたが、$(TOP) でビルドしているため、正しい相対パスではありません...単に src/plugins が必要です。

したがって、これを実行すると、出力は次のようになります (src/plugins/Cprogram.c というファイルがあると仮定します):

$ make
src/plugins/Cprogram.o
src/plugins/Cprogram.so
build the binary testProg which depends on src/plugins/Cprogram.o src/plugins/Cprogram.so
make is fun!

うまくいけば、これから残りを理解できるはずです。

詳細については、私のプロジェクト テンプレートを参照してください: https://github.com/cdesjardins/makefiles

新しいプロジェクトを開始するときはいつでも、そのレポを出発点として使用します。

于 2013-03-02T09:19:15.843 に答える