我试过寻找答案但无济于事,所以鉴于我的项目有以下结构
makefile
./src
strings.cpp
networking.cpp
./bin
strings.dll
networking.dll
./build
strings.o
networking.o
./include
strings.h
networking.h
./lib
boost
我是Makefiles的新手,从我迄今为止所做的研究中我已经设法将它们整合在一起(不是很复杂,我知道)
CC = g++
SRC = src/strings.cpp
OUT = bin/strings.dll
OBJ = build/strings.o
INC= -I include
all: strings.dll
strings.dll: strings.o
$(CC) -shared -o $(OUT) $(OBJ)
strings.o: $(SRC)
$(CC) $(INC) -DBDLL -c $(SRC) -o $(OBJ)
我遇到的问题是
1-即使我没有更改源代码,它总是经历整个编译过程?
2-我怎样才能让事情变得更有效' ?我看到人们使用通配符等的例子,但我很难跟进。我可以使用通配符开头,因为我想为每个目标分别使用dll吗?
3 - 让我们说我引入algorithms.h and algorithms.cpp
在构建中包含它的推荐方法是什么?
感谢您的帮助,非常感谢
答案 0 :(得分:1)
首先。整个编译过程是因为搜索目标" strings.dll"但是构建bin / strings.dll。所以,如果你把它替换为
bin/strings.dll: strings.o
$(CC) -shared -o $(OUT) $(OBJ)
bin/strings.o: $(SRC)
$(CC) $(INC) -DBDLL -c $(SRC) -o $(OBJ)
只有在更改先决条件时才会执行目标构建(bin / strings.o和bin / strings.dll)。
其次 - 基本上使用通配符来搜索目录中的所有文件,如下所示:$(whildcard *.cpp)
计算当前目录中的所有cpp文件。所以你可以这样写:
all_sources = $(wildcard *.cpp)
all_objects = $(addprefix bin/,$(all_sources:.cpp=.o))
all: bin/strings.dll
bin/strings.dll: $(all_objects)
<how to build strings.dll from objects>
bin/%.o: %.cpp
<how to build objects inside bin dir from cpp of current dir>
第三 - makefile不是构建系统本身,它只是一个具有领域特定语言的工具。您可以使用make编写自己的构建系统。如果你想要准备好构建,你最好学习automake / cmake / ......其中很多。
开始使用make工具也是一个很好的开始。不要停下来,你会惊讶它里面有多少力量。