メイクファイル(とおそらく一般的に)でコンパイルとリンクに関する質問があります。メイクファイル、コンパイルとリンク
私はmain()
機能を持つメインプログラムからなるserver.cファイルを持っています。 server.c
は、rio.cを含む。私はrio.c
とrio.h
からなるrio
というモジュールを持っています。それにはmain()
機能はありません。
私は実際にMakefileを書く方法とそのようなことをするためのベストプラクティスを持っています。
Q1:
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
私はこれで問題を結ぶ持っています:Makefileの
私は、次のMakefileを持っているの書き方を。私はC言語で使われているすべての関数の定義を複数持っていると言います。server.cが-c
というフラグでコンパイルされているので、実際には何もリンクされていないので、 all
ルールが両方のオブジェクトファイルを一緒にコンパイルし、すべてがリンクされた1つのオブジェクトファイルを生成するまでは、いくつかの関数が存在するが実際にそれらをリンクしていないことを知っておく必要があります。
ここで問題は何ですか?
Q2:ベストプラクティス 私は、メインプログラムを含むモジュール、その後、別のファイルを持っているので、私は別のモジュールとして、メインプログラム、server.c
をコンパイルする必要があり、その後all
で一緒に両方をコンパイルする、またはサーバーをコンパイル.cをすべて追加し、そこにrio.oモジュールを追加しますか?これは私が上に持っているのと同じリンク問題を生成するので、私は私の問題が別の場所にあると確信していることに注意してください。
あなたは、任意の外部ライブラリを使用していますか? – zeboidlund
はい。しかし、それは、server.cが最初に定義した関数というエラーを呼び出しています。 server.cとrio.hはどちらもインポートします:stdio.h、stdlib.h、unistd.h、errno.h – darksky
"server.c include rio.c"と言うとき、それはファイル 'server。あなたは '#include" rio.c "'のような行を持っていますか?もしそうなら、これは間違ったアプローチとエラーの原因である可能性があります。代わりに 'rio.h'をインクルードする必要があります。 –