使用makefile动态编译c ++代码

时间:2017-12-09 02:25:36

标签: c++ makefile

关于makefile,我想知道makefile是否可以动态编译cpp文件。

假设我有main.cpp,a.cp​​p,b.cpp和c.cpp文件。(可能会添加d.cpp,e.cpp等)

main.cpp文件有main()函数,a,b和c有自己的函数。

有时我只想编译main.cpp,a.cp​​p和b.cpp文件并链接它们。

但有时编译main.cpp,b.cpp和c.cpp文件并链接。 我想要选择编译的文件没有规则。

我认为是什么

制作一个b

制作b c

制作一个c

制作一个b c

然后只能编译指定的文件名并链接到main.cpp文件。

有没有好办法可以做到这一点?

谢谢。

1 个答案:

答案 0 :(得分:1)

有一个简单的解决方案:创建可以在命令行上传递的变量。它们优先于Makefile中的定义。

$ cat Makefile
SRCS = $(filter-out main,$(patsubst %.cpp,%,$(wildcard *.cpp)))

main: main.o $(patsubst %,%.o,$(SRCS))
    $(CXX) -o $@ $^

clean:
    rm -f $(wildcard *.o) main

然后,如果您只想链接ab

$ make SRCS="a b"
c++    -c -o main.o main.cpp
c++    -c -o a.o a.cpp
c++    -c -o b.o b.cpp
c++ -o main main.o a.o b.o

如果您只想关联cd

$ make clean
rm -f a.o b.o main.o main
$ make SRCS="c d"
c++    -c -o main.o main.cpp
c++    -c -o c.o c.cpp
c++    -c -o d.o d.cpp
c++ -o main main.o c.o d.o

默认:

$ make clean
rm -f c.o d.o main.o main
$ make
c++    -c -o main.o main.cpp
c++    -c -o a.o a.cpp
c++    -c -o b.o b.cpp
c++    -c -o c.o c.cpp
c++    -c -o d.o d.cpp
c++ -o main main.o a.o b.o c.o d.o

如果默认值没有意义(例如,因为方法是在多个源文件中定义的),请在Makefile中更改SRCS的默认值:

SRCS = a b

注意:不要混淆make变量,在命令行上的make命令之后出现哪个定义:make ... VAR=VALUE ...以及可以传递给make进程的环境变量: VAR=VALUE make ...。两者之间存在关系,但它们完全不同。