[英]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.