参数
-S -save-temps
工作正常,只要我不在同名文件上使用它们。
考虑以下情况:我有一个项目,有一个主目录和一个名为
subDir
的子目录,并且在这两个目录中都放置了名为 file.c
的文件。如果我现在调用 gcc -S -save-temps file.cpp subDir/file.c
,只会生成一个名为 file.i
的中间文件。
这是预期的行为,正如
gcc
的 man 文件告诉我的那样,使用 -save-temps
时,中间文件将始终放置在当前路径中。
我的问题是,我正在从事我事先不知道的项目。很可能有人在他的 Makefile 中构建了上述示例。在这种情况下,我会被卡住,因为我需要两个中间文件。
对我正在构建的系统说几句话(为了更好地理解):我的工具使用
make --just-print
来收集调用,即项目调用的 make 文件。我扫描这些调用以查找编译器调用,并添加 -save-temps
和 -S
选项。目的是获取编译项目过程中使用的每个预处理文件。
即使出现上述示例,我如何才能获取每个预处理文件,您有什么想法吗?
在 gcc 4.5 中,您可以在使用
-save-temps=obj
选项时使用选项 -o
。这会将中间文件保存在与输出文件相同的目录中,这可以帮助防止当您使用不同的源目录和输出目录具有相同的文件名时出现问题。
gcc -save-temps=obj -c dir1/foo.c -o dir1/foo.o
gcc -save-temps=obj -c dir2/foo.c -o dir2/foo.o
中间文件将保存为
dir1/foo.*
和 dir2/foo.*
file.cpp/file.c在不同目录下没有问题。 GCC 将根据文件的扩展名创建
*.ii
和 *.i
。
如果它们都有 c||cpp,您可以使用
-E
并仅收到一个 *.i
,您可以在其中搜索编译指示 # 1 "<FILE_PATH>"
并通过脚本提取它。