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

Posted

技术标签:

【中文标题】使用makefile动态编译c++代码【英文标题】:compile c++ code using makefile dynamically 【发布时间】:2017-12-09 02:25:35 【问题描述】:

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

假设我有 main.cpp、a.cpp、b.cpp 和 c.cpp 文件。(可能可以添加 d.cpp、e.cpp 等)

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

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

但有时会编译 main.cpp、b.cpp 和 c.cpp 文件并链接。 我想选择编译哪些文件没有规则。

我的想法是什么

做一个b

制作bc

制作一个c

做一个 b c

那么只有指定的文件名才能被编译并与main.cpp文件链接。

有没有什么好的方法可以做到这一点?

谢谢。

【问题讨论】:

这听起来像是 xy 问题。源文件不能任意组合成一个工作可执行文件......所以你将组合在一起有一些结构,并且该结构将决定什么是“好的”解决方案。 [如果我可能冒险猜测] 你可能会发现陈述你想要实现的目标更有成效,这是其中的一部分。 我同意@lockcmpxchg8b。解释为什么要动态链接不同的文件集可能会给你一个更好的答案。 【参考方案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 ...。两者之间有关系,但它们是完全不同的东西。

【讨论】:

以上是关于使用makefile动态编译c++代码的主要内容,如果未能解决你的问题,请参考以下文章

makefile 和 编译条件 的简略总结

makefile -- 动态库、进程

makefile 编译动态链接库模板

Cmake动态编译VTK库(QVtkwidget)

C开发编译与调试

C开发编译与调试