Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Некоторые аспекты работы с утилитой build.exe  (Прочитано 9146 раз)
0 Пользователей и 1 Гость смотрят эту тему.
supermaxus
Участник

ru
Offline Offline

« : 21-12-2010 09:58 » 

supermaxus, думаю, потому что How to Use the Build Utility Ага

В wdk есть  описание подобное, вашей ссылке. Однако, ни там ни здесь не сказано, почему компиляция cpp файлов, лежащих в разных каталогах происходит нормально, а вот линковка обламывается (не находит хедеров?!). Вероятно, есть какая-то хитрая директива, но она пока не найдена. Вот и приходится компилировать на исходной структуре, а линковать на мигрированной в единый каталог.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 21-12-2010 17:21 » 

supermaxus, думаю речь идет о совсем не хитрой  директиве TARGETLIBS) и файлах dir, sources и makefile)

PS и кстати, хедеры в линковке не учавствуют)
а для веры в победу, зайдите к примеру в любой каталог с cpp файлами, к примеру DDK\6001.18001\src\audio\msvad\simple\
и выполните в нем build.exe - увидите много интересного)
...так что не надо, не разобравшись, про ошибки build говорить Не-а...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
supermaxus
Участник

ru
Offline Offline

« Ответ #2 : 23-12-2010 20:38 » 

Оч. хорошо, значит для Вас не будет проблемой собрать вот такой тестовый проект на cpp файлах. Заодно, может подкинете идейку почему же оно не собирается. Пример настроен на каталог d:\out.

PS в аттаче поправил пару ошибок, но на основной результат это не повлияло:)

* sample2.zip (5.62 Кб - загружено 761 раз.)
« Последнее редактирование: 23-12-2010 20:56 от supermaxus » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 25-12-2010 01:29 » 

три варианта. настройки компилятора особо не смотрел, тупо скопипастил - там с кучей ошибок...
поэтому оно все кмпилится, линкуется и собирается, но не запускается Жжешь ну и пути не все относительные...
stdafx выкинул, не принципиально) и DriverEntry на main заменил чтоб не заморачиваться.
build можно выполнять либо в корне, либо в main - без разницы. по хорошему еще очередность сборки надо выставить, но вроде и так порядок соблюдается. и в a/b проектах выходную директорию создавать.

c:\temp - наверное правильный, через makefile (что то тут не так, хотя прокатывает)
c:\temp1 - через либы. кривовато по виду. но в пределах...
temp2  - ровно как написано в msdn.
 ибо All files specified by this macro must be located in the directory that contains the Sources file or in the parent directory of the Sources file. по описанию build.exe (при использовании makefile.def) структура проекта должны быть такой и никакой больше.
то есть по умолчанию, cpp могут лежать в директории проекта и/или в родительском каталоге. я так понял что это в makefile.new прописано... лень копаться, и так пол дня угрохал Здесь была моя ладья...

PS а по хорошему надо целиком makfile написать, там все равно 5тысяч строк лишних))) или makefile.inc....

PPS а вообще я в nmake не силен, поэтому все очень криво... но подход примерно такой...
то есть даже проще... это я по дури три раза nmake заставляю выполнятся. надо было переписывать main/makefile а не common\ca\makefile... тогда все было бы гораздо проще и правильнее)

PPPS на самом деле там еще разбираться и разбираться.
с другой стороны... смотрю я на этот build и не понимаю... зачем оно вообще нужно, кроме как если надо 500 однотипных проектов одной командой собирать в заданной структуре папок как в \ddk\src.
во всех остальных случаях nmake больше подошел бы. если только уж очень разветвленный проект собирать...
хотя тоже.... непонятно А черт его знает...

* temp.zip (86.9 Кб - загружено 779 раз.)
« Последнее редактирование: 25-12-2010 22:51 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
supermaxus
Участник

ru
Offline Offline

« Ответ #4 : 27-12-2010 19:32 » 

Благодарю за анализ и потраченное время, однако, основной целью было не найти окончательное решение (хотя это было бы интересно), а показать  суть проблемы с build. Вряд ли я смог бы сейчас написать свой достаточный для целей задачи make-файл, но нашел более простое решение проблемы - миграция файлов в спец. структуры каталог перед компиляцией. Это не очень удобно в работе, но зато все замечательно собирается, запускается и работает. Более того, оное решение позволяет сделать свой фреймворк на c++ для драйверов (аля nu-mega, зачем - ниже). Полагаю, что та же беда при сборке и с фреймворком nu-mega.

nmake не пробовал, но в любом случае везде рекомендуется финальный драйвер собирать билдом, потому, видимо, и пробовать особо не стоит.

Идея такого разветвленного каталога очень проста - фрейморк (или application server) для драйвера: когда собирается очередной проект, то из фрейморка выдергиваются нужные классы(заранее отлаженные и протестированные) и включаются в свой проект, что позволяет значительно ускорить работу над проектом, а также мыслить более общими критериями по отношению к архитектуре проекта (кстати, если вспомнить !include - волосы дыбом встают). Слить все в кучу - значить запутаться в архитектуре своего фрейморка. Согласитесь, 200-300 cpp файлов в одном каталоге просматривать тоскливо, начинаешь забывать с чего начинал:)

Полагаю, идею своего фрейморка не будет отрицать ни один программист, поскольку все свои наработки надо где-то хранить. А поскольку китайский метод программирования в жизни работает не очень хорошо (copy + past), то лучше заранее нарисовать некий код с программным интерфейсом, его отладить и далее использовать через этот интерфейс. Собсно, это и есть фреймворк. Другое дело, как его оформить: кто-то пишет на асме, кто-то на c. Ну а тому, кто понял, что делать c с++, удобнее писать фрейморк на c++.

На форумах видел много высказываний, типа в драйвере на с++ писать нечего, ну и подтвержения - типа ms не c++ драйвера почти не пишет, значит  - не надо. ИМХO, драйвера тоже бывают разные. Чем выше уровень абстракции драйвера от железа, тем больше там места для c++. Например, сравните драйвер файловой системы и драйвер сетевой карты. В ndis драйвере надо поддержать ряд определенных функций и далее просто прокинуть запрос в карту путем портов и аппаратной памяти карты. Вроде с++ тут и не нужен (но я бы и здесь нашел куда его приткнуть:), а вот в драйвере файловой системы надо уже учитывать объекты (файлы), их состояния (открыт-закрыт), права доступа к объекту и пр. И здесь очень логичным выглядит подход - для определенной группы функций иметь определенный контекст с данными. Собсно данные  + код, помещенные в отдельный модуль - это и есть классический класс (либо его инстанс - объект). Итого, там где в драйвере создается контекст, я создаю объект:) Программисты, которые пишут драйвера на С просто не знают, что они пишут, фактически, на с++, только древним способом Улыбаюсь

Да и просто, это удобно. Например, я уж забыл когда последний раз в коде вызывал функции ядра работы со строкой: выделение/освобождение памяти под строку, преобразовать число в строку, склеить строки, сконвертировать unicode к ansi, автопроверка irql для строковой функции, вывод строки в файл, парсинг файла настроек. Из проблем посерьезнее - сборка ip И tcp пакетов для отслеживания хедеров этих протоколов, аналих трафика, имперсонализация клиента в драйвере-фильтре. Все - замечательно делится на модули и классы.

Не знаю  причин, почему nu-mega перестала поддерживать свой фрейморк. Предположу, что такая штука будет не очень востребована на рынке, поскольку серьезных специалистов, которые пишут драйвера - единицы, а у них - уже есть свои наработки. Но для себя - просто милое дело:) Но кинем камешек потяжелее в сторону MS: после msvc шой-то это билд совсем как-то через известное место ..

Добавлено через 6 минут и 27 секунд:
PS По Вашей ссылке:

After the scan is complete, the Build utility starts the NMAKE utility (Nmake.exe) to build the source files...

Видимо, build и так вызывает nmake. Так, что - без разницы.
« Последнее редактирование: 27-12-2010 19:38 от supermaxus » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 27-12-2010 21:24 » new

All files specified by this macro must be located in the directory that contains the Sources file or in the parent directory of the Sources file. по описанию build.exe (при использовании makefile.def) структура проекта должны быть такой и никакой больше.
то есть по умолчанию, cpp могут лежать в директории проекта и/или в родительском каталоге.
Благодарю за анализ и потраченное время, однако, основной целью было не найти окончательное решение (хотя это было бы интересно), а показать  суть проблемы с build.
.......
Но кинем камешек потяжелее в сторону MS: после msvc шой-то это билд совсем как-то через известное место ..
Видимо , build и так вызывает nmake.

в общем то... даже не знаю как отреагировать) изучайте матчасть)

PS для пришедших в этот топик по делу, рекомендую копать с сторону BUILD_ALT_DIR, TARGETTYPE=NOTARGET и пример через либы) скорее всего это будет более корректное решение.
« Последнее редактирование: 27-12-2010 21:27 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines