У меня есть программа ac, и я хочу, чтобы абсолютные пути заголовков в этой программе c были в отдельном файле. Я использовал следующую команду
find "${pwd)" -name "#include" > file.txt.
. Может ли кто-нибудь помочь мне с этим?
Если вы ищете заголовочные файлы, которые прямо или косвенно содержатся в текущем каталоге - и предполагается, что все они имеют суффиксы .h
, то нет других файлов , названных таким образом - Вы можете просто искать файлы, имена которых заканчиваются на .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...
- это список путей к файлам заголовков, разделенных пробелами или пробел, за которым следует обратная косая черта, за которой следует новая строка, в зависимости от длины путей.
Выходные данные показываются таким образом, потому что его основная цель состоит в том, чтобы определить зависимости для построения каждой единицы перевода программы или библиотеки. Синтаксис может использоваться в make-файле. Исходя из вашего описания, звучит так, будто это не тот синтаксис, который вам нужен. Скорее всего, вы можете обработать вывод в нужный вам формат. (Например, если ни один из заголовков не содержит пробельных символов, и вы в порядке с дубликатами, вы можете передать вывод команды, например grep -oP '\S+\.h(?:\s|$)'
.)
Поскольку я не знаю, какие именно заголовочные файлы вам действительно нужно перечислить - и что вам, возможно, придется поэкспериментировать, чтобы выяснить это самостоятельно - я воздержался от подробного освещения этого аспекта. Как только вы точно определите, какие заголовки вам нужны и как их следует выяснить, любая обработка текста, вероятно, станет более простой частью.
gcc
и clang
также поддерживают опцию -H
, которую вы можете попробовать, но я предполагаю, что она будет давать гораздо больше выходных данных, чем вы хотите. См. Как узнать, откуда включен заголовочный файл? ; man gcc
; и справочное руководство GCC , особенно раздел 3.12 , для получения дополнительной информации.