Open BadEugene opened 11 years ago
Ставлю лайк! :) +1
Единственное замечание (которое нужно добавить в текст):
-DDISABLE_NEPOMUK_LEGACY -DHAVE_CONFIG_H=1 ...
и прочая шушера-мушера нам конечно не нужны, если мы ставим опцию -E
. Мы их оставляем чисто по причине экономии телодвижений.
Итаааак... я добрался до жит хабаааа!!! (Скромные аплодисменты)
И в первой статье я расскажу Вам как вычислить, через какой хеадер подключается макрос.
Для начала опишем ситуацию, допустим у нас есть большой проект, влючающий в себя еще кучу проектов, в одном из этих проектов нас интересует вот такой исходник main.cpp, вот его примерный код:
Внимание вопрос! Через какой хеадер подключается макрос KDE_EXPORT?
Конечно если мы откроем проект в среде разработки, например в KDevelop, и наведем курсор мышки на этот макрос, то мы узнаем, что макрос находится в файле kdemacros.h. Но вот беда, нет среди подключенных хеадеров этого файла, это значит он включен в другой хеадер, а тот в другой хеадер, а тот еще в другой, и вот этот последний подключен в нашем main.cpp.
Ответ прост, для начала сконфигурируем этот проект. Затем выполним команду "make VERBOSE=1 | grep main.cpp". Опция VERBOSE указывает команде make выводить наиподробнейшую информацию об этапах сборки. А grep отфильтрует все лишнее и оставит только строки с main.cpp. В процессе сборки мы увидим сообщение подобное этому:
Первая команда "cd" с параметрами нас не интересует, а вот "/usr/bin/c++ -DDISABLE..." - это то что надо. Копируем команду со всеми параметрами "/usr/bin/c++ -DDISABLE...", меняем параметр опции "-o" на "-o main.txt", сразу же за этой опцией добавляем опцию "-E" и команду для препроцессора "-Xpreprocessor -dI".
Опция "-o main.txt" указывает компиллятору сохранить результат работы в файл main.txt
Опция "-E" остановит компиллятор сразу после окончания работы препроцессора. Тоесть до компиляции исполняемого файла дело не дойдет. Опция с параметрами "-Xpreprocessor -dI" укажет препроцессору дополнить вывод информацией о всех директивах "#include".
Таким образом, наша новая команда будет выглядеть вот так:
После выполнения мы получим файл main.txt, заглянув в который, мы обнаружим такие строки:
Из этого списка можно понять, что: kdemacros.h подключается к kdecore_export.h в 24-й строке kdecore_export.h подключается к kdeversion.h в 30-й строке kdeversion.h в свою очередь подключается к kapplication.h в 26-й строке kapplication.h подключается к KApplication в 1-й строке KApplication наконец подключается к main.cpp в 1-й строке.
Итак, макрос KDE_EXPORT определен посредством файла KApplication.h!!! Вот мы его и вычислили. Всем спасибо, ставим лайки!