C ++ makefile构建多个dll和项目结构

时间:2015-07-11 00:29:09

标签: c++ gcc dll makefile

我试过寻找答案但无济于事,所以鉴于我的项目有以下结构

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在构建中包含它的推荐方法是什么?

感谢您的帮助,非常感谢

1 个答案:

答案 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工具也是一个很好的开始。不要停下来,你会惊讶它里面有多少力量。