На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Visual C++ сборка проекта через командную строку , Нужно передать свои параметры препроцессору или компилятору
    Необходимо наладить сборку проекта не из 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

    Может кто сможет помочь?
      Тут вряд-ли помогу. Но посоветую глянуть в сторону MSBuild, может там все тебе нужное получится.
        Цитата Timon K @
        Но столкнулся с тем, что нужно передать дополнительный параметр, либо как макрос либо как константу.

        Это может выглядеть так - запускаем .bat файл, в котором:

        copy откуда-то\define.h в_директорию_проекта\define.h
        C:\Users\имя_решения.sln /Rebuild Release|x64

        А в файле define.h необходимая константа и вообще все определения,
        которые надо поменять. Понятно, что для разных конфигураций define.h - разные.
        Сообщение отредактировано: ЫукпШ -
          ExpandedWrap disabled
            /Project                Задает проект для сборки, очистки или развертывания.
                                    Необходимо использовать с /Build, /Rebuild, /Clean или /Deploy.
            /ProjectConfig          Переопределяет конфигурацию проекта, указанную в
                                    конфигурации решения. Например: "Debug". Если возможно использование
                                    нескольких платформ, следует заключить имя конфигурации в кавычки
                                    и включить в него имя платформы. Например: "Debug|Win32".
                                    Необходимо использовать с /Project.
          Что касается отдельных параметров отдельным инструментам сборки, то с командной строки это не предусмотрено, т.к. практически нереализуемо. Я давно перешёл на makefiles, с ними не так удобно, но сподручнее.
          Сообщение отредактировано: Qraizer -
            ЫукпШ, похоже, что ваш вариант с подменой файла выглядит наиболее интересным для меня в данной ситуации. Этот файл даже можно даже не копировать, а создавать на лету с одним макросом и разными значениями.

            Добавлено
            Qraizer, я раньше писал на другом ЯП и, конечно, там был свой IDE, компилятор, компоновщик и т.п. Там многое было проще. В том числе можно было сборку легко автоматизировать именно за счёт того, что можно было в командной строке передать входную константу. Мой софт был в нескольких вариантах, могло быть включено несколько разных опций. Я сделал приложение - глобальный компилятор, которое запускает несколько раз сборку проекта, изменяя параметр константы и папку выходного файла в командной строке и компилятор знает, что конкретно нужно сделать (что бы лишние опции софта убрать или наоборот добавить) и куда положить готовый экзешник.
            В то же время, при отладке проекта и запуске из IDE (через F5) сборщик не имеет входной константы, которая передавалась бы с командной строкой и по этому знает, что сейчас компилируется отладка. А потому все опции должны быть скомпилированы и выданы разработчику проекта.
            Это было чертовски удобно, поэтому я ищу такой вариант тут. Или что-то подобное.
              Qraizer, да, можно создать новую конфигурацию и в ней можно задать макросы пользователя. Затем в командной строке определять, какая конфигурация будет использована при сборке проекта.
              Но у меня пока не получается извлечь эти макросы в самом коде.
                В общем всё оказалось достаточно просто. В свойствах конфигурации есть определения препроцессора. Например, в конфигурации Debug уже встроено определение _DEBUG.
                Соответственно, в коде пишем
                ExpandedWrap disabled
                  #ifdef _DEBUG
                  ...... //Дополнительный код для отладки
                  #endif

                А в конфигурации Release есть встроено определение _NDEBUG
                Далее, можно создать ещё конфигурации, например Demo, и задать там соответствующее определение препроцессору _DEMO
                Из командной строки запускаем компилятор
                C:\Users\имя_решения.sln /Rebuild Demo|x64
                И препроцессор будет иметь определение _DEMO, и в коде будет обрезано всё лишнее.
                Всё. Это то, что нужно.
                Всем спасибо.
                  Для этого препроцессор и существует. (И потому модули его никогда не заменят полностью.) Передача макросов и их значений может выполняться не только директивами #define в коде, но и параметрами компилятору, т.е. задаваться системой сборки извне компилируемого кода. А система сборки в свою очередь может их брать из других источников. Например, make (или любой его клон, тот же nmake в частности) может формировать их на лету, обрабатывая свой скрипт.
                  Конкретно Студия умеет работать с переменными окружения, которые из командной строки задавать не составляет проблемы. Достаточно в разделе "Определения препроцессора" в свойствах сборки проекта C++ предусмотреть что-то типа $(MyVars) и можно задавать set MyVars=blah-blah-blah перед сборкой как заблагорассудится.
                  Вообще вот статья на эту тему.

                  Добавлено
                  P.S. Но это естественно конкретно если компилятор. Настраивать подобным образом какой-либо другой компонент системы сборки нужно сообразно его возможностям. В общем случае не все они управляются через параметры командной строки.
                    Цитата Majestio @
                    Но посоветую глянуть в сторону MSBuild, может там все тебе нужное получится.

                    Цитата Qraizer @
                    Вообще вот статья на эту тему.

                    Qraizer, получается, что ты тоже MSBuild юзаешь/рекомендуешь? ;)
                      Нет, makefile сподручнее. Но это субъективно
                        Для сборок из командной строки лично мне понравилась связка cmake + ninja.
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0386 ]   [ 15 queries used ]   [ Generated: 18.07.25, 03:08 GMT ]