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

111*_*111 17 makefile

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

我理想的是希望拥有

project_dir
|-Makefile
|-run_tests.sh
|
|__source
|  |-program1.cpp
|  |-program2.cpp
|
|__bin
   |-program1
   |-program2
Run Code Online (Sandbox Code Playgroud)

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

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

LIST=program1 program2...

all: $(LIST)

%:  $(SOURCE)%.cpp
    $(CC) $(INC) $< $(CFLAGS) -o $(BIN)$@ $(LIBS)
Run Code Online (Sandbox Code Playgroud)

这工作除了它我无法在当前路径中看到目标,因此它认为它总是重建二进制文件,即使源文件没有更改.

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

Did*_*set 20

你快到了......

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

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

all: $(LIST)

$(BIN)/%:  $(SOURCE)%.cpp
    $(CC) $(INC) $< $(CFLAGS) -o $@ $(LIBS)
Run Code Online (Sandbox Code Playgroud)

您还可以LIST使用以下内容轻松实现

PROG=program1 program2
LIST=$(addprefix $(BIN)/, $(PROG))
Run Code Online (Sandbox Code Playgroud)

  • 是的,你可以使用`$*'来获得干. (3认同)

Art*_*nce 5

这是 Makefile 的完整现成版本。

使用以下目录准备文件夹

对于 .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
Run Code Online (Sandbox Code Playgroud)

你的最终程序将在 . 中命名为 prog /bin/,每次编译代码时,二进制文件都会被分开,/build/这样源代码目录就会非常整洁干净。

  • 您的解决方案有效,但重建了一切,这有点令人悲伤。 (3认同)
  • 这并不是“有点悲伤”,而是违背了使用 make 的全部目的。-1 (3认同)