You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Итаааак... я добрался до жит хабаааа!!! (Скромные аплодисменты)
И в первой статье я расскажу Вам как вычислить, через какой хеадер подключается макрос.
Для начала опишем ситуацию, допустим у нас есть большой проект, влючающий в себя еще кучу проектов, в одном из этих проектов нас интересует вот такой исходник main.cpp, вот его примерный код:
#include <KApplication>
#include <KAboutData>
#include <KCmdLineArgs>
// И еще куча инклудов
extern "C"
KDE_EXPORT int kdemain(int argc, char **argv)
{
// bla bla bla
// bla bla bla
return 0;
}
Внимание вопрос! Через какой хеадер подключается макрос 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".
Таким образом, наша новая команда будет выглядеть вот так:
Из этого списка можно понять, что:
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!!! Вот мы его и вычислили. Всем спасибо, ставим лайки!
The text was updated successfully, but these errors were encountered:
Единственное замечание (которое нужно добавить в текст):
-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!!! Вот мы его и вычислили. Всем спасибо, ставим лайки!
The text was updated successfully, but these errors were encountered: