[英]How to find all files that constitute a translation unit in C++?
我正在使用仅标头的库,并且只想包含我实际使用的库的一部分。
如果我包括库的头文件之一,如何找到库所包含的所有其他头文件? 或更笼统地说:我如何找到组成C ++转换单元的所有文件? (我在Linux上使用g ++。)
gcc -H产生以下形式的输出:
... /usr/include/c++/4.6/cmath .... /usr/include/math.h ..... /usr/include/x86_64-linux-gnu/bits/huge_val.h ..... /usr/include/x86_64-linux-gnu/bits/huge_valf.h
但是,您必须手动过滤掉系统头。
gcc -E给您原始的预处理输出:
# 390 "/usr/include/features.h" 2 3 4 # 38 "/usr/include/assert.h" 2 3 4 # 68 "/usr/include/assert.h" 3 4 extern "C" { extern void __assert_fail (__const char *__assertion, __const char *__file, unsigned int __line, __const char *__function) throw () __attribute__ ((__noreturn__));
您必须手动解析线标记。 请参阅: http : //gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html
gcc -M为给定的源文件生成一个Make文件。 输出如下:
object.o: mylibrary/object.h /usr/include/c++/4.6/map \\ /usr/include/c++/4.6/bits/stl_tree.h \\ /usr/include/c++/4.6/bits/stl_algobase.h \\ /usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++config.h \\
我相信您正在寻找gcc -H 。
g++ -M somefile
获取一个makefile,该makefile包含所有文件somefile作为somefile.o的依赖项。
g++ -MM somefile
相同,但是没有列出系统头文件(例如/usr/include
或/usr/local/include
)。
您需要什么呢? 如果用于依赖性跟踪,则上面的内容就足够了。 另一方面,如果您想做一些疯狂的事情,例如“我包含此标头,而该标头包含此标头,那么我就无需再次包含它”。 不,认真 别。
您可以使用GCC的-E
标志获取预处理的源,然后将其grep表示为#include
。 我不知道源文件可以通过其他任何方式找到进入翻译单元的方式,因此这应该可以完成工作。
对于g ++(我认为是大多数Unix编译器),可以使用-M
。 对于其他编译器,您将需要-E
或/E
,将输出捕获到文件中,然后使用您喜欢的脚本语言对文件进行后处理。 (我在我的makefile中执行此操作,以建立依赖关系。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.