我有 c 程序,我想将该 c 程序中的标题的绝对路径放入单独的文件中。我使用了以下命令
find "${pwd)" -name "#include" > file.txt.
谁能帮我这个?
答案1
如果你正在寻找直接或间接包含在当前目录中的头文件 - 并假设它们都有.h
后缀 no其他文件就是这样命名的——你可以搜索名称以 结尾的文件.h
:
find "$PWD" -name '*.h' >file.txt
如果您愿意,您可以用"$(pwd)"
代替。如果您按照问题所示直接使用 ,那么这将不起作用,因为您不能用 结束开头。但您走在正确的轨道上,因为使用只会给您相对路径而不是绝对路径。"$PWD"
"${pwd)"
{
)
.
name "#include"
不起作用的原因是-name
指定要匹配的名称或模式文件名。在 C 中包含头文件时,确实使用了指令#include
,但这不是名称的一部分。
另一方面,如果您只想查找程序中使用的头文件,或者想要查找包含在程序目录树(我假设是当前目录)之外的头文件,那么您可能需要检查文件的内容。
如果您使用这样的系统,您可能能够从Makefile
或之类的文件中获取信息。否则,或者如果这不能满足您的需要,那么您将需要研究编译器提供哪些功能来执行此操作。如果您使用或,那就是和选项。不同之处在于不列出系统标头。对于传递给编译器的每个文件,它显示的格式是:CMakeLists.txt
gcc
clang
-M
-MM
-MM
filename.c
filename.o: filename.c headers...
在哪里headers...
是头文件路径的列表,用空格或空格后跟反斜杠再跟换行符分隔,具体取决于路径的长度。
输出以这种方式显示,因为它的主要目的是指定构建程序或库的每个翻译单元的依赖项。发出的语法可以在 makefile 中使用。根据您的描述,这听起来不是您想要的语法。您可以将输出处理成您需要的格式。(例如,如果没有任何标题包含空格字符并且您可以接受重复项,则可以管道输出到类似 的命令grep -oP '\S+\.h(?:\s|$)'
)
因为我不太清楚您实际上需要列出哪些头文件(您可能需要自己尝试才能找到答案),所以我没有详细介绍这方面的内容。一旦您弄清楚了您到底需要哪些头文件以及应该如何找出它们,剩下的文本处理可能就会变得比较简单了。
gcc
还clang
支持一个-H
选项,你可以尝试一下,但我猜它会产生比你想要的更多的输出。参见如何判断头文件从哪里被包含?;man gcc
;和GCC 参考手册, 尤其第3.12节, 了解更多信息。