 Visual C++ сборка проекта через командную строку
    , Нужно передать свои параметры препроцессору или компилятору
    Visual C++ сборка проекта через командную строку
    , Нужно передать свои параметры препроцессору или компилятору
  |  | Наши проекты: Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту | |
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.107] | 
|   | 
 | 
 Правила раздела Visual C++ / MFC / WTL (далее Раздела)
    Правила раздела Visual C++ / MFC / WTL (далее Раздела)
   FAQ Раздела
 FAQ Раздела   Обновления для FAQ Раздела
 Обновления для FAQ Раздела    Поиск по Разделу
 Поиск по Разделу   MSDN Library Online
 MSDN Library Online Visual C++ сборка проекта через командную строку
    , Нужно передать свои параметры препроцессору или компилятору
    Visual C++ сборка проекта через командную строку
    , Нужно передать свои параметры препроцессору или компилятору
  | 
         
         
          
           Сообщ.
           #1
          
          , 
          
         
         | |
|  |  Необходимо наладить сборку проекта не из IDE, а из другого приложения для автоматизации процесса компиляции. Для этого запускаю из стороннего приложения процесс devenv.exe с параметрами C:\Users\имя_решения.sln /Rebuild Release|x64 И это работает (правда что долго), проект собирается без открытия GUI Visual Studio. Т.е. на выходе получаю обновлённый экзешник, с которым далее приложение будет производить дальнейшие манипуляции. Но столкнулся с тем, что нужно передать дополнительный параметр, либо как макрос либо как константу. Это нужно для того, что бы сборщик знал, что ему собирать в данный момент - отладочную версию, демонстрационную версию либо рабочую версию. Ну, например, это могло бы выглядеть так: C:\Users\имя_решения.sln /Rebuild Release|x64 /Define MY_VERSION=1 Но, к сожалению, это не работает и ничего подобного в документации я не увидел. Описание параметров для devenv тут: https://learn.microsoft.com/ru-ru/visualstu...es?view=vs-2022 Может кто сможет помочь? | 
| 
         
         
          
           Сообщ.
           #2
          
          , 
          
         
         | |
|  |  Тут вряд-ли помогу. Но посоветую глянуть в сторону MSBuild, может там все тебе нужное получится.   | 
| 
         
         
          
           Сообщ.
           #3
          
          , 
          
         
         | |
|  | Цитата Timon K @  Но столкнулся с тем, что нужно передать дополнительный параметр, либо как макрос либо как константу. Это может выглядеть так - запускаем .bat файл, в котором: copy откуда-то\define.h в_директорию_проекта\define.h C:\Users\имя_решения.sln /Rebuild Release|x64 А в файле define.h необходимая константа и вообще все определения, которые надо поменять. Понятно, что для разных конфигураций define.h - разные. | 
|   | 
         
         
          
           Сообщ.
           #4
          
          , 
          
         
         | 
|  |   /Project                Задает проект для сборки, очистки или развертывания.                         Необходимо использовать с /Build, /Rebuild, /Clean или /Deploy. /ProjectConfig          Переопределяет конфигурацию проекта, указанную в                         конфигурации решения. Например: "Debug". Если возможно использование                         нескольких платформ, следует заключить имя конфигурации в кавычки                          и включить в него имя платформы. Например: "Debug|Win32".                         Необходимо использовать с /Project. | 
| 
         
         
          
           Сообщ.
           #5
          
          , 
          
         
         | |
|  |  ЫукпШ, похоже, что ваш вариант с подменой файла выглядит наиболее интересным для меня в данной ситуации. Этот файл даже можно даже не копировать, а создавать на лету с одним макросом и разными значениями.  Добавлено Qraizer, я раньше писал на другом ЯП и, конечно, там был свой IDE, компилятор, компоновщик и т.п. Там многое было проще. В том числе можно было сборку легко автоматизировать именно за счёт того, что можно было в командной строке передать входную константу. Мой софт был в нескольких вариантах, могло быть включено несколько разных опций. Я сделал приложение - глобальный компилятор, которое запускает несколько раз сборку проекта, изменяя параметр константы и папку выходного файла в командной строке и компилятор знает, что конкретно нужно сделать (что бы лишние опции софта убрать или наоборот добавить) и куда положить готовый экзешник. В то же время, при отладке проекта и запуске из IDE (через F5) сборщик не имеет входной константы, которая передавалась бы с командной строкой и по этому знает, что сейчас компилируется отладка. А потому все опции должны быть скомпилированы и выданы разработчику проекта. Это было чертовски удобно, поэтому я ищу такой вариант тут. Или что-то подобное. | 
| 
         
         
          
           Сообщ.
           #6
          
          , 
          
         
         | |
|  |  Qraizer, да, можно создать новую конфигурацию и в ней можно задать макросы пользователя. Затем в командной строке определять, какая конфигурация будет использована при сборке проекта.  Но у меня пока не получается извлечь эти макросы в самом коде. | 
| 
         
         
          
           Сообщ.
           #7
          
          , 
          
         
         | |
|  |  В общем всё оказалось достаточно просто. В свойствах конфигурации есть определения препроцессора. Например, в конфигурации Debug уже встроено определение _DEBUG.  Соответственно, в коде пишем   #ifdef _DEBUG ...... //Дополнительный код для отладки #endif А в конфигурации Release есть встроено определение _NDEBUG Далее, можно создать ещё конфигурации, например Demo, и задать там соответствующее определение препроцессору _DEMO Из командной строки запускаем компилятор C:\Users\имя_решения.sln /Rebuild Demo|x64 И препроцессор будет иметь определение _DEMO, и в коде будет обрезано всё лишнее. Всё. Это то, что нужно. Всем спасибо. | 
|   | 
         
         
          
           Сообщ.
           #8
          
          , 
          
         
         | 
|  |  Для этого препроцессор и существует. (И потому модули его никогда не заменят полностью.) Передача макросов и их значений может выполняться не только директивами #define в коде, но и параметрами компилятору, т.е. задаваться системой сборки извне компилируемого кода. А система сборки в свою очередь может их брать из других источников. Например, make (или любой его клон, тот же nmake в частности) может формировать их на лету, обрабатывая свой скрипт. Конкретно Студия умеет работать с переменными окружения, которые из командной строки задавать не составляет проблемы. Достаточно в разделе "Определения препроцессора" в свойствах сборки проекта C++ предусмотреть что-то типа $(MyVars) и можно задавать set MyVars=blah-blah-blah перед сборкой как заблагорассудится. Вообще вот статья на эту тему. Добавлено P.S. Но это естественно конкретно если компилятор. Настраивать подобным образом какой-либо другой компонент системы сборки нужно сообразно его возможностям. В общем случае не все они управляются через параметры командной строки. | 
| 
         
         
          
           Сообщ.
           #9
          
          , 
          
         
         | |
|  | Цитата Majestio @  Но посоветую глянуть в сторону MSBuild, может там все тебе нужное получится. Цитата Qraizer @  Вообще вот статья на эту тему. Qraizer, получается, что ты тоже MSBuild юзаешь/рекомендуешь?   | 
|   | 
         
         
          
           Сообщ.
           #10
          
          , 
          
         
         | 
|  |  Нет, makefile сподручнее. Но это субъективно   | 
| 
         
         
          
           Сообщ.
           #11
          
          , 
          
         
         | |
|  |  Для сборок из командной строки лично мне понравилась связка cmake + ninja.   |