0

私は約200の.cファイルといくつかの.hファイルを含むCプロジェクトに取り組んでいます。これらの200個のファイルすべてが最終製品に必要なわけではありません。現在、約180個のファイルをコンパイルする必要があります。プロジェクトに必要なこれらの180個の*.cファイルを含むファイル「compile_only_these.c」があります。makefileは、個々の.cファイルではなく、このファイルのみをコンパイルします。

/* file: compile_only_these.c*/

#include "file1.c"
#include "file2.c"
.
.
.
#include "file180.c"

しかし、.cファイルを含めるのは悪い考えだと思います。これらのファイルのいずれかを変更するたびに、すべてのファイルが再度コンパイルされるためです。

これらのファイルをコンパイルするためのより良い方法を提案できますか。

より詳しい情報:

  • すべての.cファイルは同じフォルダ「../project/src」にあります
  • コンパイルが必要な新しい.cファイルを追加し続けます。新しいファイルを追加するたびにMakefileを変更したくありません。
  • 現在コンパイルしていない20個の.cファイルを保持したいと思います。将来使うかもしれません。これらのファイルを削除すると、他のディレクトリに移動されますが、解決策ではありません
4

2 に答える 2

0

必要なのは、次のような必要なオブジェクトファイルのリストであるmakefileの変数です。

OBJS := file1.o file2.o ... file180.o

compile_only_these.c次のように、Makeにファイルから構築させることができます。

OBJS := $(shell sed -e '/\#include/!d' -e 's/\#include "\(.*\)\.c"/\1.o/' compile_only_these.c)

これらのオブジェクトを使用して最終製品を作成するルールを備えた手も必要ですか?

于 2013-03-15T20:24:16.037 に答える
0

すでに述べたように、これはプロジェクトを管理するための奇妙な方法のようなものですが、作業する必要があるものを考えると、このアプローチに沿って何かを試すことができます...

CC = gcc
OBJFILE = myprog

# Tweak to match whatever you compile with normally
CFLAGS  = -O2 -Wall -std=c89 -pedantic
LDFLAGS= # Extra flags here, for example -lm -pthread 

RM = rm -f

SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)

$(OBJFILE):$(OBJS)
    $(CC) -o $@ $^ $(LDFLAGS)


clean:
    $(RM) core *~ $(OBJS) $(OBJFILE)

このファイルのリストをコンパイルするだけでなく、makeでより多くのことを実行したい場合は、ビルド階層の詳細に合わせてパスを調整する必要がありますが、これはワイルドカード置換を使用してすべてのファイルを取得するための一般的なアプローチです。

于 2013-03-15T21:10:45.127 に答える