是否有自动的方法来检测我应该编译哪些.cpp源文件(取决于#include *.h)

Is there automated way to detect which .cpp source files I should be compiling (depending on #include *.h)

本文关键字:源文件 cpp 取决于 #include 编译 方法 我应该 检测 是否      更新时间:2023-10-16

我有旧的大代码库,因为我只需要在我的主要功能的一小部分,我正在寻找一种方法来自动检测所需的。cpps(假设它们在同一文件夹中,并具有与。h文件匹配的名称)。
不幸的是,我仍然需要大量的代码,所以手工浏览代码是不可能的。是否有工具可以从我的"main.cpp"递归地找出所有需要的。h文件,这样我就可以做简单的字符串替换(.h -> .cpp)并将其交给编译器。

大多数编译器可以为您做这些,例如GCC和Clang提供-M-MM来列出源文件的所有依赖项。还有其他选项可以排除系统头文件等。参考你的编译器的文档获取更多信息,或者,如果你需要帮助,告诉我们你正在使用哪个编译器。

你的方法有一个问题,虽然:你可以从main.cpp中找出包含的头,没有问题,但是如果你想为头编译相应的.cpp文件,这些实现文件通常需要其他没有直接或间接从main.cpp中包含的头,你也需要那些头的.cpp文件。清洗并重复。:)

如果手动迭代查找.cpp文件的过程不是一个选项,您可以使用Makefile:

CPPFILES := $(wildcard *.cpp)
DEPFILES := $(CPPFILES:%.cpp=%.d)
%.d: %.cpp
    g++ -MM $< -o $@
include $(DEPFILES)
%.o: %.cpp
    @echo "$@"
%.h: %.o
    @:

然后调用

make main.o

,让make找出还需要哪些文件。以上当然是一个简化的例子,您可能有一个更复杂的目录结构,您可能需要为g++添加一些编译选项,但我希望这是一个开始。

将代码库编译为静态库(lib (Windows)。你只需要这样做一次,除非你修改了代码库——即使这样,你也只需要重新编译你修改的代码。

在您的可执行项目中,包括您正在使用的头文件,并在您的链接器设置中包含库。链接器只会将可执行文件实际使用的编译定义(来自静态库中的目标文件)链接到最终的。exe。