1
#include <stdio.h>
#include <math.h>

int main(void)
{
    double test=23.4;
    test=sqrt(test);
    printf("%f",test);
}

これをコンパイルするには、次を使用します: gcc -o test test.c -L/path/to/libs -lm

ただし、数学ライブラリと将来使用するその他の標準ライブラリを自動的にリンクするために、makefile を使用したいと考えています。

これは私が使用しているmakefileです:

CC=gcc
CFLAGS=-Wall
LDFLAGS=-lm

OBJECTS=client.o
SOURCE=client.c

client: $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o client $(LDFLAGS) $(LIBS)

all:client

.PHONY: clean
clean:
    rm -f *~ *.o client

ライブラリを自動的にリンクするには、このメイクファイルをどのように変更すればよいですか?

4

2 に答える 2

2

他の回答のコメントから、make testメイクファイルで指定されているものとは異なるプログラムを構築するために使用しているようです(入力したときに得られるものmake)それを機能させたい場合は、正しい変数名を使用する必要がありますデフォルトのルール:

CC=gcc
CFLAGS=-Wall
LDFLAGS=-L/path/to/libs
LDLIBS=-lm

makefile でこれだけを使用make testして、test.c を test という名前の実行可能ファイルにコンパイルする (またはmake clientclient.c をコンパイルする) ことができます。

複数のファイルを単一の実行可能ファイルにコンパイルする場合は、makefile にあるような規則を追加する必要があります (代わりに、標準の変数名を使用します)。

OBJECTS=client.o otherfile.o extra.o

client: $(OBJECTS)
        $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)

編集

明確にするため.cに、実行可能ファイルに一致するルールが他にない場合に GNU-make が実行可能ファイルを生成するためにファイルに適用するデフォルトのルールは次のとおりです。

.c:
         $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@

他のバージョンの make も同様のことを行います ($(TARGET_ARCH)$(LOADLIBES)は GNU make に固有のものであり、多くの make には もありません$(CPPFLAGS))。make -pMakefile のないディレクトリで実行すると、既定のルール セットを確認できます。

必要に応じて、上記のパターン ルールを Makefile 内の別のものに置き換えることができます。その場合、make は指定されたとおりに実行します。

于 2013-08-27T23:28:34.880 に答える
0
CC=gcc
CFLAGS=-Wall
LDFLAGS=-lm
LIBPATH=-L/path/to/libs

OBJECTS=client.o
SOURCE=client.c

client: $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o client $(LIBPATH) $(LDFLAGS) $(LIBS)

all:client

.PHONY: clean
clean:
rm -f *~ *.o client
于 2013-08-27T21:09:42.040 に答える