1

コンパイルしようとすると、ファイルの 1 つで「メインへの未定義参照」エラーが発生します。これは、このファイルに main メソッドがないためです。これは一部のヘルパー メソッドの実装ファイルにすぎないため、実行可能ファイルではなくオブジェクト ファイルにコンパイルするだけです。各ファイルに対して何をすべきかメイクファイルに明示的に指示する場合、これを行う方法は知っていますが、すべてのソースを一度にコンパイルするメイクファイルを作成しようとしています。フラグを使用してみました-cが、すべてのファイルが実行可能ファイルではなくオブジェクト ファイルのみにコンパイルされました。どうやってこれを行うのですか?ここにあります:

CC = gcc
CFLAGS = -g -Wall
SRCS = ./src/server.c ./src/client_slave.c ./src/sockaddrAL.c
EXECS = ./bin/server ./bin/client_slave
OBJS = $(SRCS:.c=.o)

all: clean $(SRCS) server client

server: $(OBJS)
        $(CC) $(CFLAGS) ./src/server.o -o ./bin/server

client: $(OBJS)
        $(CC) $(CFLAGS) ./src/client_slave.o -o ./bin/client_slave

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

clean:
        @rm -f $(EXECS) $(OBJS)
4

2 に答える 2

3

ファイルをビルドするルール (サフィックス ルール)に-cフラグを追加し、実行可能ファイルをビルドするルール (ルール) には追加しないでください。.o.c.o$(EXECS)

CC = gcc
CFLAGS = -g -Wall
EXECS = ./bin/server ./bin/client_slave

all: $(EXECS)

./bin/%: ./src/%.o ./src/sockaddrAL.o
        $(CC) $(CFLAGS) -o $@ $^

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

clean:
        @rm -f $(EXECS) $(OBJS)

あなたの質問には sockAddrAL がまったく表示されなかったので、両方の実行可能ファイルに属していると思いました。また、上記の構文は GNU を想定していることにも注意してくださいmake。POSIX 標準で利用可能な機能のみを使用したい場合は、makeほとんどすべてを書き出す必要があります。

于 2013-05-29T13:15:46.683 に答える
1

暗黙のルールを友達にしましょう。Makfefile 全体は次のようになります。

CC = clang
CFLAGS = -O0 -g -Wall
SRCS = server.c client_slave.c sockaddrAL.c
OBJS = $(SRCS:.c=.o)
EXECS = server

server: $(OBJS)

clean:
    @rm -f $(EXECS) $(OBJS)

src ディレクトリから呼び出します。

于 2013-05-29T13:19:11.540 に答える