Получение путей включения cpp search - PullRequest
3 голосов
/ 17 октября 2010

Как получить, чтобы система включала пути поиска препроцессора C?Это для скрипта, который анализирует произвольные исходные файлы и должен знать полные пути к заголовкам, которые они #include.Давайте на мгновение проигнорируем, что пользователь может изменить эту последовательность путей поиска с помощью флагов компилятора.Я бы предпочел решение, использующее стандартные инструменты, которые есть в системах POSIX, поэтому мой сценарий практически не зависит.

Я пробовал:

cpp -v </dev/null | unusually_complex_filter

Но, очевидно, это не учитываеттакие вещи, как $C{,PLUS}_INCLUDE_PATH.Чтобы узнать, где находится вектор #include <vector>, я должен знать пути поиска в их точном порядке.

Ответы [ 3 ]

0 голосов
/ 27 октября 2010

с test.cpp вот так:

#include <string>
#include <iostream>

int main(int, char **)
{
  return 0
}

и cpp из gcc toolsuite вы можете позвонить:

cpp test.cpp | grep '^#.*' | awk '{print $3}'

вы получите

"test.cpp"
"<built-in>"
"<command-line>"
"test.cpp"
"/usr/include/c++/4.4/string"
"/usr/include/c++/4.4/string"
"/usr/include/c++/4.4/string"
"/usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h"    
"/usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h"
"/usr/include/c++/4.4/x86_64-linux-gnu/bits/os_defines.h"

и многие другие строки.

Очевидно, вы получите много «дубликатов», так как многие включаемые файлы также включены в другие включаемые файлы.

0 голосов
/ 10 ноября 2010

После некоторого чата для получения контекста, я думаю, что этот вопрос - просто недоразумение cpp для разбора разных языков.

Я не знаю, как переносимый -x (или какФормат вывода portable -v, в этом отношении), хотя другие компиляторы могут иметь что-то очень похожее (например, я думаю, что компилятор Intel ведет себя одинаково), но, похоже, вам просто нужно сказать cpp, какой язык вы для него используетечтобы включить его зависящие от языка, внутренне сконфигурированные пути:

$ cpp --version  # my cpp is from gcc
cpp (Ubuntu 4.4.3-4ubuntu5) 4.4.3
...
$ cpp -v </dev/null 2>&1 1>/dev/null | sed -nr 's/^ ([^ ]+)$/\1/p'
/usr/local/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
/usr/include/i486-linux-gnu
/usr/include
$ cpp -v -x c++ </dev/null 2>&1 1>/dev/null | sed -nr 's/^ ([^ ]+)$/\1/p'
/usr/include/c++/4.4
/usr/include/c++/4.4/i486-linux-gnu
/usr/include/c++/4.4/backward
/usr/local/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
/usr/include/i486-linux-gnu
/usr/include

Это очень удобно, когда ваш скрипт принимает специфичные для проекта пути включения:

$ mkdir my-include  # or else cpp ignores it
$ cpp -Imy-include -v -x c++ </dev/null 2>&1 1>/dev/null | sed -nr 's/^ ([^ ]+)$/\1/p'
my-include
/usr/include/c++/4.4
/usr/include/c++/4.4/i486-linux-gnu
/usr/include/c++/4.4/backward
/usr/local/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
/usr/include/i486-linux-gnu
/usr/include

Возвращенный порядок - это порядокпоиск, однако <> includes пропускает пути для "" включает (но "" включает делает поиск <> пути).Здесь вывод cpp различает два набора путей, если вам это нужно.

0 голосов
/ 24 октября 2010

Стандартные заголовки не обязательно должны быть доступны как обычные файлы, содержащие стандартный C-источник. Обычно они доступны в виде файлов, но используют много расширений.

Возможно, вы можете запустить препроцессор, который доступен в POSIX-совместимом режиме как c99 -E, для исходных файлов и использовать его вывод. POSIX не определяет точный вывод препроцессора, но обычно содержит специальные строки, которые показывают происхождение каждой фактической строки.

...