Makefile(そしておそらく一般的に)でのコンパイルとリンクに関して質問があります。
関数を持つメインプログラムで構成されるserver.cファイルがありmain()
ます。server.c
rio.cを含みます。rio
とで構成されるモジュールがrio.c
ありrio.h
ます。機能はありませんmain()
。
Makefileを実際に作成する方法と、そのようなことを行うためのベストプラクティスの2つの質問があります。
Q1:Makefileの書き方
私は次のMakefileを持っています:
CC = gcc
CFLAGS = -Wall -Werror -Wmissing-prototypes
OBJS = server.o rio.o
all: $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o sysstatd
server.o: server.c
$(CC) $(CFLAGS) -c server.c
rio.o: rio.c rio.h
$(CC) $(CFLAGS) -c rio.c
clean:
rm -f *~ *.o sysstatd
私はこれとリンクの問題を抱えています。Cで使用されるすべての関数の定義が複数あると書かれています。server.cは-c
フラグを使用してコンパイルされているため、実際には何もリンクされていないため、これがどのように可能かわかりません。all
一部の関数は存在しますが、ルールが両方のオブジェクトファイルを一緒にコンパイルし、すべてがリンクされた単一のオブジェクトファイルを生成するまで、実際にはそれらをリンクしないことを知っておく必要があります。
ここでの問題は何ですか?
Q2:ベストプラクティス
モジュールとメインプログラムを含む別のファイルがあるので、メインプログラムをserver.c
別のモジュールとしてコンパイルしてから、両方を一緒にコンパイルするall
か、server.cをすべてコンパイルしてrioを追加する必要があります。 oモジュールはありますか?これでも上記と同じリンクの問題が発生するため、問題は別の場所にあると確信しています。