我希望能够将我的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,但我不想这样做。
答案 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/
然后在/
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
设置为源目录,隐式规则将再次起作用。