#c #visual-studio #visual-c #compiler-construction #c-preprocessor
#c #visual-studio #visual-c #компилятор-построение #c-препроцессор
Вопрос:
Я хочу, чтобы компилятор запустил предварительную обработку, сгенерировал все файлы .i, как это обычно делается, если я просто использую опцию «сгенерировать предварительно обработанный файл», а затем запустил внешний инструмент, дождался его завершения, а затем продолжил компиляцию этих файлов .i (которые к настоящему времени, конечно, могут быть изменены).
Если это невозможно, есть ли способ запустить внешний инструмент для каждого файла, который компилируется перед предварительной обработкой и компиляцией? (Вероятно, было бы чертовски сложно отлаживать в такой среде, но все же).
Если такой опции нет, можно ли это вообще сделать? Я имею в виду, использует ли компилятор вообще эти файлы .i, или они просто каким-то образом выводятся для пользователя?
В принципе, есть ли какой-нибудь способ автоматически изменять исходный код перед его компиляцией, но без изменения самих файлов?
Просто для ссылок: я пытаюсь придумать разумный способ запутать все строки с минимальной модификацией исходного кода.
Комментарии:
1. 1 за упоминание реальных намерений!
Ответ №1:
Да, вы бы просто обновили свою систему сборки, чтобы в ней был этап предварительной обработки, этап обфускации, а затем этап компиляции в obj. По умолчанию большинство систем сборки просто объединяют все это в один шаг (и пропускают шаг запутывания). Не должно быть большой проблемы с любой «реальной» системой сборки, такой как Scons, waf или даже Make.
Если вы используете Visual Studio, то это требует немного больше работы. Microsoft хочет, чтобы вы писали свои операции сборки в MSBuild, и это довольно много работы, ИМХО. Это непросто, потому что MSVS — это в основном IDE для итеративной разработки, а не инструмент сборки. Это не инструмент сборки и никогда им не будет (хотя он и выполняет «сборку вещей», но только стандартную и очень простую «сборку вещей»). Но вы все равно можете использовать IDE с другим инструментом сборки. Например, мы используем Scons для нашей сборки, и он генерирует MSV *.sln
и *.vcproj
файлы, и эти файлы просто создаются с помощью Scons (но все файлы редактируются в MSVS IDE).
Простой ответ: Ваш вопрос — это очень простая проблема с операциями сборки. Это должно быть очень просто с любой системой сборки, отличной от «игрушечной».
Distcc (инструмент распределенной сборки) эффективно выполняет предварительную обработку всех файлов локально, затем отправляет *.i
удаленным компиляторам (которым даже не нужны установленные заголовки), а затем отправляет обратно *.obj
. Итак, то, о чем вы говорите, довольно прямолинейно.
Комментарии:
1. Я хотел бы сделать все в IDE (о чем я мог бы более четко упомянуть в вопросе, как я вижу сейчас), поэтому я дал флаг ответа ybungalobill. Но ваш ответ идеально подходит для моего неясного вопроса, так что спасибо! Говоря о системах сборки, хороша ли Boost-build? Кажется естественным выбором, поскольку boost в любом случае используется практически в любом моем проекте…
2. Я не работал с Boost-build напрямую, но отзывы таковы, что это очень мощный, очень запутанный в работе и очень медленный. Но, YMMV. Если вы ищете «простую», вы можете выбрать любую из «самых популярных» систем сборки, потому что у них, как правило, много упрощенных оболочек, и я не думаю, что Boost-build пока относится к этой категории зрелости. (Удачи!)
Ответ №2:
Пусть x.cpp это ваш файл, который вы хотите предварительно обработать.
- Установите параметр компилятора для генерации предварительно обработанных выходных данных для x.cpp пусть это будет x.i.
- Добавьте x.i в проект и установите «пользовательский инструмент сборки» в свойствах. Установите для «выходных файлов» значение x.preprocessed.cpp.
- Добавить x.preprocessed.cpp для проекта.
Подробности см. в msdn.
Комментарии:
1. Будь я проклят, я думал, что ваше решение не сработает, потому что файлы будут сталкиваться (обработанный и необработанный), но оказывается, что когда включена опция / EP / P, сгенерированный файл .i не компилируется в .obj автоматически, он просто генерируется, что идеально для меня. Большое спасибо за ответ на мой точный вопрос!
2. Я столкнулся с небольшой проблемой: кажется, это работает, но проблема в том, что компоновщик каким-то образом запрашивает объектные файлы исходных файлов «source». Итак, в приведенном вами примере это выдало бы мне ошибку «не удается открыть входной файл x.obj». Несмотря на то, что x.preprocesssed.obj компилируется и включается нормально. Есть идеи?
Ответ №3:
Вы должны быть в состоянии выполнить «Событие предварительной сборки» и подключить к нему любые внешние инструменты. В VS200x это находится в разделе Свойства конфигурации -> События сборки -> События предварительной сборки.
Комментарии:
1. Они запускаются до запуска сборки, не так ли? И единственные файлы, которые я могу изменить на этом этапе, — это фактические исходники, чего я не хочу делать. Я хочу изменить некоторые промежуточные файлы, чтобы реальный исходный код оставался неизменным, но я все еще могу выполнять свои хитрые действия (что значительно снизило бы читаемость).
Ответ №4:
Просто используйте приличную систему сборки. SCons, waf или что-то еще, если вам не нравятся эти два.
Комментарии:
1. Ic, никогда раньше ими не пользовался, но теперь я вижу причину. Могут ли они быть каким-то образом включены в Visual Studio, или мне придется 1) переместить все настройки проекта в какой-нибудь конфигурационный файл и обновлять их только там и 2) выполнить сборку только с использованием инструмента, а не IDE?
Ответ №5:
Вы могли бы использовать make-файл для создания файлов .i сначала запустите на них обработку, затем скомпилируйте их.