Makefile如何为源代码和二进制文件使用单独的目录?

时间:2012-02-07 14:46:56

标签: makefile

我希望能够将我的bin和我的代码文件拆分成单独的目录,因为它在当前状态下变得难以管理。

我理想的是希望

project_dir
|-Makefile
|-run_tests.sh
|
|__source
|  |-program1.cpp
|  |-program2.cpp
|
|__bin
   |-program1
   |-program2

但是我无法使用我当前的系统工作而无需手动写出每个程序的规则(请记住,每个程序都是一个单独的程序,而不是一系列链接在一​​起的对象)

#Current make system
BIN=./bin/
SOURCE=./source/

LIST=program1 program2...

all: $(LIST)

%:  $(SOURCE)%.cpp
    $(CC) $(INC) $< $(CFLAGS) -o $(BIN)$@ $(LIBS)

除了它之外我无法在当前路径中看到目标,因此它认为即使源文件没有更改它也会重建二进制文件。

我目前唯一想到的是编写一个程序来制作一个makefile,但我不想这样做。

3 个答案:

答案 0 :(得分:19)

你差不多......

#Current make system
BIN=./bin/
SOURCE=./source/

LIST=$(BIN)/program1 $(BIN)/program2...

all: $(LIST)

$(BIN)/%:  $(SOURCE)%.cpp
    $(CC) $(INC) $< $(CFLAGS) -o $@ $(LIBS)

您还可以使用以下

使LIST更容易
PROG=program1 program2
LIST=$(addprefix $(BIN)/, $(PROG))

答案 1 :(得分:3)

这是一个完整的Makefile准备版本。

使用以下目录准备文件夹

for .o文件:/build/ 对于.cpp文件:/src/ 对于二进制文件:/bin/

然后在/

使用以下Makefile
CC          = g++
LD          = g++ 
CFLAG       = -Wall
PROG_NAME   = prog

SRC_DIR     = ./src
BUILD_DIR   = ./build
BIN_DIR     = ./bin
SRC_LIST = $(wildcard $(SRC_DIR)/*.cpp)
OBJ_LIST = $(BUILD_DIR)/$(notdir $(SRC_LIST:.cpp=.o))

.PHONY: all clean $(PROG_NAME) compile

all: $(PROG_NAME)

compile: 
    $(CC) -c $(CFLAG) $(SRC_LIST) -o $(OBJ_LIST)

$(PROG_NAME): compile
    $(LD) $(OBJ_LIST) -o $(BIN_DIR)/$@

clean:
    rm -f $(BIN_DIR)/$(PROG_NAME) $(BUILD_DIR)/*.o

您的最终程序将在/bin/中命名为prog,每次编译代码时,二进制文件将在/build/分隔,以便源代码目录非常整洁干净。

答案 2 :(得分:2)

简易解决方案:使用automake

如果您想手动执行此操作,则需要使用vpath指令或VPATH环境变量。 GNU make手册有关于它们的a section。将Makefile直接放入bin目录,将VPATH设置为源目录,隐式规则将再次起作用。