2

私はいくつかのアプリケーションがあるプロジェクトを始めています。これらのアプリケーションは、ソースファイルに関していくつかの共通の機能を共有しています。各アプリケーションには独自のmakeファイルが必要ですが、共通の場所からこれらの共有ソースファイルにリンクできる必要があります。

これを説明するために、これが私のディレクトリレイアウトです:

project/
    lib/
        shared1/
            shared1.c
            shared1.h
        shared2/
            shared2.c
            shared2.h
    app1/
        app1.c
        app1.h
        makefile
    app2/
        app2.c
        app2.h
        makefile

現在、makefileの1つは次のようになっています。

CC=gcc
XXXCFLAGS=-Wall -Wextra -pedantic -I../../lib/shared1
CFLAGS=-I. $(XXXCFLAGS)
DEPS = app2.h ../../lib/shared1/shared1.h
OBJ = ${DEPS:.h=.o}
LIBS=-lpthread

%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

app2: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)
  1. これは、共有ソースの管理を行うためのほぼ正しい方法ですか、それともより良い方法がありますか。それらは別々にコンパイルされたライブラリである必要がありますか?もしそうなら、どのように?

  2. このような相対パスは大丈夫ですか?

  3. このようなものにautotoolsを使用する必要がありますか?例を見た後、共有コードまたはライブラリをリンクする方法がわかりませんでした。

どんなガイダンスでも大歓迎です。

4

2 に答える 2

2

ソースファイルとヘッダーファイルを分離することを検討するかもしれませんが、これはソースツリーをレイアウトするための合理的な方法です。ライブラリを構築する場合(たとえば、多くのアプリが使用する場合shared1)、そのルールを記述し、そのルールをのmakefileに配置できshared1/ます。このようなルールを使用する方法はいくつかありますが、ライブラリが必要であることが確実になるまでは心配しないでください。

パスは必要悪です。それらはmakefileを特定のディレクトリレイアウトにロックしますが、それらなしでは完全に行うことはできません。あなたができることは、それらを囲い込むことです:

SHARED1LIB = ../../lib/shared1
XXXCFLAGS=-Wall -Wextra -pedantic -I$(SHARED1DIR)
DEPS = app2.h $(SHARED1DIR)/shared1.h

依存関係の使用は少し独特です。一つには、ソースのリストからオブジェクトのリストを導出する方が良いです。なぜなら、ヘッダーのないソースまたはソースのないヘッダーがあるかもしれないからです。

SRCS = app2.c $(SHARED1DIR)/shared1.c
OBJ = ${SRCS:.c=.o}

次に、すべてのオブジェクトファイルをすべてのヘッダーに依存させるようます。これはおそらくやり過ぎです。foo.oに依存すると仮定できます。foo.hまた、それは;にapp2.o依存します。shared1.h次に、はるかに優れたルールを記述できます。

%.o: %.c %.h
    $(CC) -c -o $@ $< $(CFLAGS)

app2.o: $(SHARED1DIR)/shared1.h

オブジェクトがたくさんあり、このアプローチが面倒な場合は、これらのリストを自動的に処理する非常に高度な方法がありますが、これは高度な手法であり、まだ試してはいけないでしょう。

最後に、すべてのアプリのmakefileが非常によく似ていることがわかった場合は、一般的なものをすべて取得して、project/

SHARED1LIB = ../../lib/shared1
SHARED2LIB = ../../lib/shared2

CC=gcc
XXXCFLAGS=-Wall -Wextra -pedantic
CFLAGS=-I. $(XXXCFLAGS)
OBJ = ${SRCS:.c=.o}
LIBS=-lpthread

%.o: %.c %.h
    $(CC) -c -o $@ $< $(CFLAGS)

app%: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)

次に、アプリのmakefileは次のようになります。

SRCS = app2.c $(SHARED1DIR)/shared1.c

app2:
include ../Makefile

XXXCFLAGS += -I$(SHARED1DIR)

app2.o: $(SHARED1DIR)/shared1.h
于 2012-06-19T21:13:05.510 に答える
1

プロジェクトでは相対パスは完全に問題ありません...コードを共有する簡単な方法の1つは、ヘッダーとライブラリを共通の場所にエクスポートしてから、ドライバープログラムをそれらにリンクすることです。

このアプローチは、私の個人的なプロジェクトの多くで使用されています。CMakeを使用して、すべてのアプリケーションターゲットを自分のライブラリにリンクすることもあります。

于 2012-06-19T20:38:34.710 に答える